📄 model.c
字号:
{0,0,0,0, 0,0,0,255, 0,0},
{0,0,0,0, 0,0,0,255, 0,0},
{0,0,0,0, 0,0,0,255, 0,0},
{0,0,0,0, 0,0,0,255, 0,0},
// zaxis arrow
{0,0,0,0, 0,0,255,255, 0,0}, // arrow tip is blue
{0,0,0,0, 255,0,0,255, 0,0}, // base vertices are red
{0,0,0,0, 255,0,0,255, 0,0},
{0,0,0,0, 255,0,0,255, 0,0},
{0,0,0,0, 255,0,0,255, 0,0},
};
/* Vertex lists for the axis*/
// y axis stick (rectangle) // Rectangle faces:
const int16 Vlist1[] = {0,1,2,0,2,3, 3,2,6,3,6,7 , // front face, left face
7,6,5,7,5,4, 4,5,0,0,5,1 , // back face, right face
3,7,4,3,4,0, 2,5,6,2,1,5 }; // top face, bottom face
// y axis arrow
const int16 Vlist2[] = {8,10,9,8,9,11,8,11,12,8,12,10};
// bottom of y axis arrow
const int16 Vlist3[] = {9, 12, 11, 9, 10, 12}; // square base of pyramid, 2 triangles
// x axis stick (rectangle) // Rectangle faces:
const int16 Vlist4[] = {13,14,15,13,15,16, 16,15,19,16,19,20, // front face, left face
20,19,18,20,18,17, 17,18,13,13,18,14 , // back face, right face
16,20,17,16,17,13, 15,18,19,15,14,18 };// top face, bottom face
// x axis arrow
const int16 Vlist5[] = {21,23,22,21,24,23,21,25,24,21,22,25};
// bottom of x axis arrow
const int16 Vlist6[] = {23,24,25,23,25,22}; // square base of pyramid, 2 triangles
// z axis stick (rectangle) // Rectangle faces:
const int16 Vlist7[] = {26,27,28,26,28,29, 29,28,32,29,32,33, // front face, left face
33,32,31,33,31,30, 30,31,26,26,31,27 , // back face, right face
29,33,30,29,30,26, 28,31,32,28,27,31 };// top face, bottom face
// z axis arrow
const int16 Vlist8[] = {34,38,36,34,36,35,34,35,37,34,37,38};
// bottom of z axis arrow
const int16 Vlist9[] = {36,37,35,36,38,37}; // square base of pyramid, 2 triangles
const AEE3DPoint Vertices[] =
{
/* The following is the list of vertex locations for the x,y,z axis model.
Each axis is represented as a long rectangle with an arrow at the end.
The length of the rectangle is 16*MODEL_SCALE/15.
The width and height are both 2*MODEL_SCALE/50.
8 vertices are required to model a rectangle.
The arrow is a square base pyramid.
The vertical distance between the tip of the pyramid to the base
is 3*MODEL_SCALE/15.
5 vertices are required to model a pyramid, 1 for the tip, and 4
for the square base.
*/
// ***Y-AXIS***
// y axis stick
{4*MODEL_SCALE/50,0*MODEL_SCALE/15,0*MODEL_SCALE/50}, // 0 : Upper right, near
{4*MODEL_SCALE/50,16*MODEL_SCALE/15,0*MODEL_SCALE/50}, // 1 : Lower right, near
{0*MODEL_SCALE/50,16*MODEL_SCALE/15,0*MODEL_SCALE/50}, // 2 : Lower left, near
{0*MODEL_SCALE/50,0*MODEL_SCALE/15,0*MODEL_SCALE/50}, // 3 : Upper left, near
{4*MODEL_SCALE/50,0*MODEL_SCALE/15,4*MODEL_SCALE/50}, // 4 : Upper right, far
{4*MODEL_SCALE/50,16*MODEL_SCALE/15,4*MODEL_SCALE/50}, // 5 : Lower right, far
{0*MODEL_SCALE/50,16*MODEL_SCALE/15,4*MODEL_SCALE/50}, // 6 : Lower left, far
{0*MODEL_SCALE/50,0*MODEL_SCALE/15,4*MODEL_SCALE/50}, // 7 : Upper left, far
// y axis arrow
{2*MODEL_SCALE/50, 19*MODEL_SCALE/15, 2*MODEL_SCALE/50 }, //8: top vertex for arrow
{-5*MODEL_SCALE/50,16*MODEL_SCALE/15, -5*MODEL_SCALE/50 }, //9: left near vertex for arrow
{9*MODEL_SCALE/50, 16*MODEL_SCALE/15, -5*MODEL_SCALE/50 }, //10: right near vertex for arrow
{-5*MODEL_SCALE/50, 16*MODEL_SCALE/15, 9*MODEL_SCALE/50 }, //11: left far vertex for arrow
{9*MODEL_SCALE/50, 16*MODEL_SCALE/15, 9*MODEL_SCALE/50 }, //12: right far vertex for arro
// ***X-AXIS***
// x axis stick
{16*MODEL_SCALE/15,0*MODEL_SCALE/50,0*MODEL_SCALE/50}, // 13 : Upper right, near
{16*MODEL_SCALE/15,4*MODEL_SCALE/50,0*MODEL_SCALE/50}, // 14 : Lower right, near
{0*MODEL_SCALE/15,4*MODEL_SCALE/50,0*MODEL_SCALE/50}, // 15 : Lower left, near
{0*MODEL_SCALE/15,0*MODEL_SCALE/50,0*MODEL_SCALE/50}, // 16 : Upper left, near
{16*MODEL_SCALE/15,0*MODEL_SCALE/50,4*MODEL_SCALE/50}, // 17 : Upper right, far
{16*MODEL_SCALE/15,4*MODEL_SCALE/50,4*MODEL_SCALE/50}, // 18 : Lower right, far
{0*MODEL_SCALE/15,4*MODEL_SCALE/50,4*MODEL_SCALE/50}, // 19 : Lower left, far
{0*MODEL_SCALE/15,0*MODEL_SCALE/50,4*MODEL_SCALE/50}, // 20 : Upper left, far
// x axis arrow
{19*MODEL_SCALE/15, 2*MODEL_SCALE/50, 2*MODEL_SCALE/50}, // 21: top vertex, arrow
{16*MODEL_SCALE/15, 9*MODEL_SCALE/50, -5*MODEL_SCALE/50}, // 22: lower near vertex, arrow
{16*MODEL_SCALE/15, -5*MODEL_SCALE/50, -5*MODEL_SCALE/50}, // 23: upper near vertex, arrow
{16*MODEL_SCALE/15, -5*MODEL_SCALE/50, 9*MODEL_SCALE/50}, // 24: upper far vertex, arrow
{16*MODEL_SCALE/15, 9*MODEL_SCALE/50, 9*MODEL_SCALE/50}, // 25: lower far vertex, arrow
//***Z-AXIS***
// z axis stick
{4*MODEL_SCALE/50,0*MODEL_SCALE/50,0*MODEL_SCALE/15}, // 26 : Upper right, near
{4*MODEL_SCALE/50,4*MODEL_SCALE/50,0*MODEL_SCALE/15}, // 27 : Lower right, near
{0*MODEL_SCALE/50,4*MODEL_SCALE/50,0*MODEL_SCALE/15}, // 28 : Lower left, near
{0*MODEL_SCALE/50,0*MODEL_SCALE/50,0*MODEL_SCALE/15}, // 29 : Upper left, near
{4*MODEL_SCALE/50,0*MODEL_SCALE/50,16*MODEL_SCALE/15}, // 30 : Upper right, far
{4*MODEL_SCALE/50,4*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 31 : Lower right, far
{0*MODEL_SCALE/50,4*MODEL_SCALE/50,16*MODEL_SCALE/15}, // 32 : Lower left, far
{0*MODEL_SCALE/50,0*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 33 : Upper left, far
// z axis arrow
{2*MODEL_SCALE/50, 2*MODEL_SCALE/50, 19*MODEL_SCALE/15}, // 34: top vertex, arrow
{-5*MODEL_SCALE/50, -5*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 35: upper left, arrow
{-5*MODEL_SCALE/50, 9*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 36: lower left, arrow
{9*MODEL_SCALE/50, -5*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 37: upper right, arrow
{9*MODEL_SCALE/50, 9*MODEL_SCALE/50, 16*MODEL_SCALE/15}, // 38: lower right, arrow
};
// save the initial locations of the arrow tips, as these
// will be needed to display the x,y,z labels for the axis
pMe->xarrow = Vertices[21];
pMe->yarrow = Vertices[8];
pMe->zarrow = Vertices[34];
// Allocate memory for the model, with 39 vertices and 9 vertex lists
Model = AllocateObj(39, 9, VlistSize);
// copy all the vertex data to the model
if (Model)
{
MEMCPY( Model->Model, AxisModelInit, sizeof(AxisModelInit) );
MEMCPY( Model->Vertices, Vertices, sizeof(Vertices) );
MEMCPY( Model->VlistArray[0].Vlist, Vlist1, sizeof(Vlist1) );
Model->RMode[0] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[1].Vlist, Vlist2, sizeof(Vlist2) );
Model->RMode[1] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[2].Vlist, Vlist3, sizeof(Vlist3) );
Model->RMode[2] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[3].Vlist, Vlist4, sizeof(Vlist4) );
Model->RMode[3] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[4].Vlist, Vlist5, sizeof(Vlist5) );
Model->RMode[4] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[5].Vlist, Vlist6, sizeof(Vlist6) );
Model->RMode[5] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[6].Vlist, Vlist7, sizeof(Vlist7) );
Model->RMode[6] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[7].Vlist, Vlist8, sizeof(Vlist8) );
Model->RMode[7] = AEE3D_TRIANGLE;
MEMCPY( Model->VlistArray[8].Vlist, Vlist9, sizeof(Vlist9) );
Model->RMode[8] = AEE3D_TRIANGLE;
}
// The number of triangles in a triangle vertex list is the number of vertices
// divided by 3.
Model->VlistArray[0].NumTriangles=Model->VlistArray[0].VlistSize/3;
Model->VlistArray[1].NumTriangles=Model->VlistArray[1].VlistSize/3;
Model->VlistArray[2].NumTriangles=Model->VlistArray[2].VlistSize/3;
Model->VlistArray[3].NumTriangles=Model->VlistArray[3].VlistSize/3;
Model->VlistArray[4].NumTriangles=Model->VlistArray[4].VlistSize/3;
Model->VlistArray[5].NumTriangles=Model->VlistArray[5].VlistSize/3;
Model->VlistArray[6].NumTriangles=Model->VlistArray[6].VlistSize/3;
Model->VlistArray[7].NumTriangles=Model->VlistArray[7].VlistSize/3;
Model->VlistArray[8].NumTriangles=Model->VlistArray[8].VlistSize/3;
return Model;
}
/*==========================================================================
FUNCTION:
Obj_BuildCubeModel
DESCRIPTION:
Allocate and build a simple cube Obj using triangle fans.
Obj should be freed using the function Obj_FreeObj().
PROTOTYPE:
ObjType *Obj_BuildCubeModel( TutorI3D* pMe )
PARAMETERS:
TutorI3D *pMe - Pointer to the applet instance.
DEPENDENCIES
none
RETURN VALUE:
Pointer to model or NULL;
SIDE EFFECTS
none
==========================================================================*/
ObjType *Obj_BuildCubeModel( TutorI3D* pMe )
{
ObjType *Model;
const uint16 VlistSize[2] = { 8, 8 };
const AEE3DTLVertex CubeModelInit[] =
{
{0,0,0,0, 0, 0,255, 63, 0,95},
{0,0,0,0, 255,255, 0, 63, 95,95},
{0,0,0,0, 0,255,255, 63, 0,0},
{0,0,0,0, 255, 0,255, 63, 95,0},
{0,0,0,0, 255, 0, 0, 63, 0,95},
{0,0,0,0, 0,255, 0, 63, 95,95},
{0,0,0,0, 0, 0,255, 63, 0,0},
{0,0,0,0, 255, 0, 0, 63, 95,0},
};
const int16 Vlist1[] = {0,1,6,3,5,2,7,1};
const int16 Vlist2[] = {4,5,3,6,1,7,2,5};
const AEE3DPoint Vertices[] =
{{-2*MODEL_SCALE/3,-2*MODEL_SCALE/3,-2*MODEL_SCALE/3},
{2*MODEL_SCALE/3,-2*MODEL_SCALE/3,-2*MODEL_SCALE/3},
{-2*MODEL_SCALE/3,2*MODEL_SCALE/3,-2*MODEL_SCALE/3},
{-2*MODEL_SCALE/3,-2*MODEL_SCALE/3,2*MODEL_SCALE/3},
{2*MODEL_SCALE/3,2*MODEL_SCALE/3,2*MODEL_SCALE/3},
{-2*MODEL_SCALE/3,2*MODEL_SCALE/3,2*MODEL_SCALE/3},
{2*MODEL_SCALE/3,-2*MODEL_SCALE/3,2*MODEL_SCALE/3},
{2*MODEL_SCALE/3,2*MODEL_SCALE/3,-2*MODEL_SCALE/3}};
Model = AllocateObj( 8, 2, VlistSize );
if (Model)
{
MEMCPY( Model->Model, CubeModelInit, sizeof(CubeModelInit) );
MEMCPY( Model->Vertices, Vertices, sizeof(Vertices) );
MEMCPY( Model->VlistArray[0].Vlist, Vlist1, sizeof(Vlist1) );
Model->RMode[0] = AEE3D_TRIANGLE_FAN;
MEMCPY( Model->VlistArray[1].Vlist, Vlist2, sizeof(Vlist2) );
Model->RMode[1] = AEE3D_TRIANGLE_FAN;
}
Model->VlistArray[0].NumTriangles=Model->VlistArray[0].VlistSize-2;
Model->VlistArray[1].NumTriangles=Model->VlistArray[1].VlistSize-2;
return Model;
}
/*==========================================================================
FUNCTION:
BuildSphereModel
DESCRIPTION:
Allocate and build a simple discrete triangle sphere model. Model
should be freed using the function Obj_FreeObj().
PROTOTYPE:
ObjType *Obj_BuildSphereModel( TutorI3D *pMe )
PARAMETERS:
TutorI3D *pMe - Pointer to the applet instance.
DEPENDENCIES
none
RETURN VALUE:
Pointer to model or NULL;
SIDE EFFECTS
none
==========================================================================*/
ObjType *Obj_BuildSphereModel( TutorI3D *pMe )
{
const uint16 VlistSize[1] = { 60 * 3 };
ObjType *Model;
uint32 i;
int16 *VlistBall;
AEE3DPoint *Vertices;
AEE3DTLVertex *BallModel;
int32 theta, phi, theta_offset;
uint16 t1, t2;
Model = AllocateObj( 32, 1, VlistSize );
if (Model)
{
Vertices = Model->Vertices;
BallModel = Model->Model;
VlistBall = Model->VlistArray[0].Vlist;
Model->RMode[0] = AEE3D_TRIANGLE;
Vertices->x = 0;
Vertices->y = MODEL_SCALE;
Vertices->z = 0;
Vertices++;
BallModel->s = 127;
(BallModel++)->t = 127;
theta_offset = 0;
for (phi = 3; phi < 18; phi += 3)
{
for (theta = theta_offset; theta < 36 + theta_offset; theta += 6)
{
BallModel->s = (theta * 256 / 36) & 255;
(BallModel++)->t = 127 - phi * 128 / 18;
Vertices->x = (((I3DUtil_cos( pMe->m_p3DUtil, theta * 4096 / 36 ) *
I3DUtil_sin( pMe->m_p3DUtil, phi * 4096 / 36 )) >> 8) *
MODEL_SCALE_DIV_1K) >> 6;
Vertices->y = (I3DUtil_cos( pMe->m_p3DUtil, phi * 4096 / 36 ) *
MODEL_SCALE_DIV_1K) >> 2;
Vertices->z = (((I3DUtil_sin( pMe->m_p3DUtil, theta * 4096 / 36 ) *
I3DUtil_sin( pMe->m_p3DUtil, phi * 4096 / 36 )) >> 8) *
MODEL_SCALE_DIV_1K) >> 6;
Vertices++;
}
theta_offset += 3;
}
Vertices->x = 0;
Vertices->y = -MODEL_SCALE;
Vertices->z = 0;
Vertices++;
BallModel->s = 127;
BallModel->t = 0;
i = 0;
t1 = 6;
while (i < 18)
{
VlistBall[i++] = t1;
t1 = (t1 + 4) % 6 + 1;
VlistBall[i++] = 0;
VlistBall[i++] = t1;
}
t1 = 1;
t2 = 7;
while (i < 54)
{
VlistBall[i++] = t1;
t1 = (t1 % 6) + 1;
VlistBall[i++] = t2;
VlistBall[i++] = t1;
VlistBall[i++] = t1;
VlistBall[i++] = t2;
t2 = (t2 % 6) + 7;
VlistBall[i++] = t2;
}
for (; i < 162; i++)
{
VlistBall[i] = VlistBall[i - 36] + 6;
}
t1 = 25;
while (i < 180)
{
VlistBall[i++] = t1;
t1 = (t1 % 6) + 25;
VlistBall[i++] = 31;
VlistBall[i++] = t1;
}
}
Model->VlistArray[0].NumTriangles=Model->VlistArray[0].VlistSize/3;
for(i=0; i<Model->NumVertices; i++)
Model->Model[i].a = 63;
return Model;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -