Toturial OpenGL

Just To show You how to import .3ds File To OpenGL

____________________________________________________________________________________________________________

:: Fungsi "ComputeNormals( ) " :

  1. i. fungsi mengira vertex nomal dan normal sesuatu objek, Aturcara bermula dengan menaip :-
        1. void CLoad3DS::ComputeNormals(t3DModel *pModel) //menerima pModel yang dihantar pada fungsi Import3DS
          {
  2. ii. kemudian mengistiharkan penentu yang terlibat diantaranya:-
        1. Vec3f vVector1, vVector2, vNormal, vPoly[3];
  3. iii. Bagi mengelakkan masalah jika tiada objek yang dimuat turun maka taip :-

        1. if(pModel->numOfObjects <= 0) // jika tiada objek maka ia boleh fungsi seterusnya dapat diabaikan
          return; //kembali ker Import3Ds

<Info> Apa itu Vertex normals?? dan apa perbezaannya dengan normal

-apa kata jika mencari normal pada sebuah segitiga, maka anda dapat melihat "face Normals". Jika kita lihat pula face Normals bagi OpenGL yang memperuntukkan pencahayaan, maka anda akan dapat melihat objek itu kelihatan seperti mendatar dan tidak kelihatan tidak terlalu berbentuk (kelihatan 2 demensi)

-jika kita mencari normal untuk setiap vertex, ia akan membuat kelicinan dalam pencahayaan. Ini kerana mempengaruhi setiap permuakaan dan menyebabkan ia kelihatan lebih seperti poligon(kelihatan seperti 3 dimensi). Pada asasnya ia berlaku dalam 2 peringkat. peringkat pertama mengira permukaan normal, dan selepas itu mendapatkan nilai purata bagi setiap vertex. Ingat hanya nilai purata sahaja okey yang lain tak boleh, untuk mendapatkan nilai yang ideal untuk vertex.

iv. Dibawah adalah aturcara yang mengajar kita bagai mengira normal bagi setiap permukaan objek :-

for(int index = 0; index < pModel->numOfObjects; index++) /* mengambil semua objek yang terlibat */
{
t3DObject *pObject = &(pModel->pObject[index]); //dapatkan objeck

// disinilah tempat dimana anda meletakkan semua memory yang dikehendaki untuk mengira normal
Vec3f *pNormals = new Vec3f [pObject->numOfFaces];
Vec3f *pTempNormals = new Vec3f [pObject->numOfFaces];
pObject->pNormals = new Vec3f [pObject->numOfVerts];


for(int i=0; i < pObject->numOfFaces; i++)// mengambil semua permukaan objek yang terlibat
{
//Untuk membuang code yang besar dan mewujudkawe extract the 3 points of this face
vPoly[0] = pObject->pVerts[pObject->pFaces[i].vertIndex[0]];
vPoly[1] = pObject->pVerts[pObject->pFaces[i].vertIndex[1]];
vPoly[2] = pObject->pVerts[pObject->pFaces[i].vertIndex[2]];

/*Sekarang mari kita mengira permukaan normal (dengan mendapatkan 2 vektor and mencari titik persilangan nya)*/

/* Dapatkan vertor bagi poligon(anda hanya perlu 2 bahagian yang normal) */

vVector1 = Vector(vPoly[0], vPoly[2]);
vVector2 = Vector(vPoly[2], vPoly[1]); // Dapatkan vertor yang kedua

/* Pulangan nilai 2 vektor produk yang bersilang antara satu sama lain(vektor normal, dan bukan verkor unit) */

vNormal = (vVector1^vVector2).Normalize();
pTempNormals[i] = vNormal; /* simpan dan umpukkan nilai yang dikir di baris diatas dengan menggunakan array untuk vertex normal */

pNormals[i] = vNormal; // Umpukkan normal diatas kepada List normal
}

iii. Dan sekarang marilah kita bersama yer adik-adik kita mendapatkan vertex normal, okey mari kita mulakan dengan dengan pengistiharan bagi nilai-nilai yang bergantung:-

Vec3f vSum(0,0,0); //mengandunggi x,y,z yang bernilai 0
Vec3f vZero = vSum;
int shared=0;// menilai awalan shared bersamaan dengan 0

iv. Anda semakin maju sekarang baiklah mari kita bergerak selangkah lagi, mari kita megira vertex normal pulak:-

for (i = 0; i < pObject->numOfVerts; i++) // melalui semua vertex
{
for (int j = 0; j < pObject->numOfFaces; j++) //melalui semua objek
{ // Memeriksa sama ada vertex ada berkongsi permukaan dengan vertex yang lain
if (pObject->pFaces[j].vertIndex[0] == i ||


pObject->pFaces[j].vertIndex[1] == i ||
pObject->pFaces[j].vertIndex[2] == i)
{

vSum = vSum+pTempNormals[j]; /* letakkan un-normalized normal kepada permukaan yang berkongsi */
shared++; // Menambah kan nilai gelung sehinnga " pObject lebih kecil dari j"
}
}

v. Kemudian dapatkan nilai normal dengan membahagikan nilai sum dengan shared :-

pObject->pNormals[i] = vSum / float(-shared);

vi. Pernormalan semua titik normal untuk setiap vertex normal yang terakhir :-

pObject->pNormals[i] = pObject->pNormals[i].Normalize();

vii. Mengembalikan nilai awalan bagi :-

vSum = vZero; // menggumpukkan nilai awalan semula bagi sum
shared = 0; // menggumpukkan nilai awalan semula bagi shared kepada nilai 0

<Info>"ini bertujuan mengelakkan kesalahan atau ralat apabila kita membaca suatu objek yang lain "

}

viii. Kosongkan memory untuk kegunaan objek lain :-

delete [] pTempNormals;
delete [] pNormals;

__________________________________________________________________________________________________________

<Next Step Tutorial>
Hosted by www.Geocities.ws

1