⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 model.c

📁 用brew开发3D的例程
💻 C
📖 第 1 页 / 共 2 页
字号:

	{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 + -