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

📄 our_math.c

📁 MTK上3D特效的一些开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	//有一个4舍5入的过程
	FIXP16 x,y,z;
	x=va->M[0];
	y=va->M[1];
	z=va->M[2];
	vprod->M[0] = (x*mb->M[0][0] + y*mb->M[1][0] + z*mb->M[2][0] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
	vprod->M[1] = (x*mb->M[0][1] + y*mb->M[1][1] + z*mb->M[2][1] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
	vprod->M[2] = (x*mb->M[0][2] + y*mb->M[1][2] + z*mb->M[2][2] +(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT;
} 
//------------------------------------------------------------------------
void OUR_FIX_VECTOR3D_SUB(	FIX_VECTOR3D_PTR  	va, 					//20t
											FIX_VECTOR3D_PTR  	vb,
											FIX_VECTOR3D_PTR  	vprod)
{
	vprod->M[0] = va->M[0]-vb->M[0];
	vprod->M[1] = va->M[1]-vb->M[1];
	vprod->M[2] = va->M[2]-vb->M[2];
} 
//------------------------------------------------------------------------
void OUR_FIX_VECTOR3D_ADD(	FIX_VECTOR3D_PTR  	va, 					//20t
											FIX_VECTOR3D_PTR  	vb,
											FIX_VECTOR3D_PTR  	vprod)
{
	vprod->M[0] = va->M[0]+vb->M[0];
	vprod->M[1] = va->M[1]+vb->M[1];
	vprod->M[2] = va->M[2]+vb->M[2];
} 
//------------------------------------------------------------------------
void OUR_VECTOR3D_SUB(	OUR_3D_POINT_PTR  	va, 
											OUR_3D_POINT_PTR  	vb,
											OUR_3D_POINT_PTR  	vprod)
{
//	vprod->M[0] = va->M[0]-vb->M[0];
//	vprod->M[1] = va->M[1]-vb->M[1];
//	vprod->M[2] = va->M[2]-vb->M[2];
} 

//*********************************************************************
//P1=P0 x M
//参数1: 
//return:

//注意:	ma的所有值绝对值<0x8000=32768
//		mb的所有值绝对值<0x8000
//*********************************************************************
void OUR_FIX_Mat_Mul_3X3(	FIX_MATRIX_3X3_PTR  	ma, 			//320t
								FIX_MATRIX_3X3_PTR 	mb,
								FIX_MATRIX_3X3_PTR  	mprod)
{
	FIXP16 x,y,z;
	sint32 i;
	for(i=0;i<3;i++)
	{	
		x=ma->M[i][0];
		y=ma->M[i][1];
		z=ma->M[i][2];
		mprod->M[i][0] =  (x*mb->M[0][0] + y*mb->M[1][0] + z*mb->M[2][0]+(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT ;
		mprod->M[i][1] =  (x*mb->M[0][1] + y*mb->M[1][1] + z*mb->M[2][1]+(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT ;
		mprod->M[i][2] =  (x*mb->M[0][2] + y*mb->M[1][2] + z*mb->M[2][2]+(1<<(FIXP15_SHIFT-1)))>>FIXP15_SHIFT ;
	}
} 
//------------------------------------------------------------------------

/****************************************/
  /*Function: 开根号处理                  */
  /*入口参数:被开方数,长整型            */
  /*出口参数:开方结果,整型              */
  /****************************************/
  unsigned int OUR_sqrt_16(unsigned long M)				//250t
  {
      unsigned int N, i;
      unsigned long tmp, ttp;   	// 结果、循环计数
      if (M == 0)               		// 被开方数,开方结果也为0
          return 0;
      N = 0;
      tmp = (M >> 30);          	// 获取最高位:B[m-1]
      M <<= 2;
      if (tmp > 1)              		// 最高位为1
      {
          N ++;                 		// 结果当前位为1,否则为默认的0
          tmp -= N;
      }
      for (i=15; i>0; i--)      		// 求剩余的15位
      {
          N <<= 1;              		// 左移一位
          tmp <<= 2;
          tmp += (M >> 30);     	// 假设
          ttp = N;
          ttp = (ttp<<1)+1;
          M <<= 2;
          if (tmp >= ttp)       		// 假设成立
          {
              tmp -= ttp;
              N ++;
          }
      }
      return N;
  }
//---------------------------------------------------------------

void OUR_VECTOR3D_Normalize(FIX_VECTOR3D_PTR va)	//400t
{
	uint32	length,length_inv;
	while(OUR_int_abs(va->MM.x) >0x4000 ||	//本来的模不能太大,可能平方后加起溢出
		  OUR_int_abs(va->MM.y) >0x4000 ||
		  OUR_int_abs(va->MM.z) >0x4000 )
	{
		va->MM.x >>=1;
		va->MM.y >>=1;
		va->MM.z >>=1;
	}
	length = OUR_sqrt_16(va->MM.x*va->MM.x + va->MM.y*va->MM.y + va->MM.z*va->MM.z);//250t
	if (length ==0) 
	   return;
	length_inv =1<<31;								// can't use 0xffffffff, cause va->x is always < 0x80000000
	length_inv /=length;

	// compute normalized version of vector
	va->MM.x=(va->MM.x*length_inv);
	va->MM.x =( va->MM.x) >>(31-FIXP15_SHIFT);

	va->MM.y=(va->MM.y*length_inv);
	va->MM.y =( va->MM.y) >>(31-FIXP15_SHIFT);

	va->MM.z=(va->MM.z*length_inv);
	va->MM.z =( va->MM.z) >>(31-FIXP15_SHIFT);
}
//---------------------------------------------------------------

void OUR_FAST_Normalize(FIX_VECTOR3D_PTR va)	//200t
{
	uint32	length,length_inv;

	length =OUR_FAST_Length(va);
	if (length ==0) 
	   return;
	//length_inv =1<<31;								// can't use 0xffffffff, cause va->x is always < 0x80000000
	length_inv= (1<<31)/length;

	// compute normalized version of vector
	va->MM.x=(va->MM.x*length_inv);
	va->MM.x =( va->MM.x) >>(31-FIXP15_SHIFT);

	va->MM.y=(va->MM.y*length_inv);
	va->MM.y =( va->MM.y) >>(31-FIXP15_SHIFT);

	va->MM.z=(va->MM.z*length_inv);
	va->MM.z =( va->MM.z) >>(31-FIXP15_SHIFT);
}

//---------------------------------------------------------------

FIXP16 OUR_VECTOR3D_Dot(FIX_VECTOR3D_PTR va, FIX_VECTOR3D_PTR vb)//40t
{
return( (va->MM.x * vb->MM.x) + (va->MM.y * vb->MM.y) + (va->MM.z * vb->MM.z) );
}

//---------------------------------------------------------------

void OUR_VECTOR3D_Cross(FIX_VECTOR3D_PTR va, //80t
                    FIX_VECTOR3D_PTR vb,
                    FIX_VECTOR3D_PTR vn)
{

vn->MM.x =  ( (va->MM.y * vb->MM.z) - (va->MM.z * vb->MM.y) );
vn->MM.y = -( (va->MM.x * vb->MM.z) - (va->MM.z * vb->MM.x) );
vn->MM.z =  ( (va->MM.x * vb->MM.y) - (va->MM.y * vb->MM.x) ); 

} 
//--------------------------------------------------------------------


//---------------------------------------------------------------

int OUR_FAST_Length(FIX_VECTOR3D_PTR va)	//50t // compute distance with 2% error--writed by mjb on 2008/03/15
{	
	int i=10;  	// 
	int temp;  	// used for swaping
	uint32 x,y,z; 	// used for algorithm

	// make sure values are all positive
	x = OUR_int_abs(va->MM.x);
	y = OUR_int_abs(va->MM.y);
	z = OUR_int_abs(va->MM.z);

	// sort values
	if (y < x) OUR_SWAP(x,y,temp)
	if (z < y) OUR_SWAP(y,z,temp)
	if (y < x) OUR_SWAP(x,y,temp)

	while(z>(1<<20))
		{
		x>>=1;
		y>>=1;
		z>>=1;
		i--;
		}
	if(x<(y>>1))
		{
		temp=(1024*y+195*x)>>10;
		}
	else
		{
		temp=(829*y+608*x)>>10;
		}
	if(temp<(z>>1))
		{
		return (1024*z+195*temp)>>(i);
		}
	else
		{
		return (829*z+608*temp)>>(i);
		}
} 
//--------------------------------------------------------------------

 int OUR_Mat_Inverse_3X3(FIX_MATRIX_3X3_PTR m, FIX_MATRIX_3X3_PTR mi)//400t
{
// this function computes the inverse of a 3x3
// first compute the determinate to see if there is 
// an inverse
  //FIX_MATRIX_3X3	mb;
  sint32 det_inv,det;

  det = 	 (m->MM.M00>>5)*((m->MM.M11*m->MM.M22 - m->MM.M21*m->MM.M12)>>10) - //80t
              (m->MM.M01>>5)*((m->MM.M10*m->MM.M22 - m->MM.M20*m->MM.M12)>>10) + 
              (m->MM.M02>>5)*((m->MM.M10*m->MM.M21 - m->MM.M20*m->MM.M11)>>10);
  
  if (det==0)
     return(0);
  
  // compute inverse to save divides
  det_inv = (1<<30)/(det>>15);										//80t
#define I_LEFT_MOVE 15
  // compute inverse using m-1 = adjoint(m)/det(m)
  mi->MM.M00 =  (det_inv*((m->MM.M11*m->MM.M22 - m->MM.M21*m->MM.M12)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M10 = (-det_inv*((m->MM.M10*m->MM.M22 - m->MM.M20*m->MM.M12)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M20 =  (det_inv*((m->MM.M10*m->MM.M21 - m->MM.M20*m->MM.M11)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  
  mi->MM.M01 = (-det_inv*((m->MM.M01*m->MM.M22 - m->MM.M21*m->MM.M02)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M11 =  (det_inv*((m->MM.M00*m->MM.M22 - m->MM.M20*m->MM.M02)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M21 = (-det_inv*((m->MM.M00*m->MM.M21 - m->MM.M20*m->MM.M01)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  
  mi->MM.M02 =  (det_inv*((m->MM.M01*m->MM.M12 - m->MM.M11*m->MM.M02)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M12 = (-det_inv*((m->MM.M00*m->MM.M12 - m->MM.M10*m->MM.M02)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  mi->MM.M22 =  (det_inv*((m->MM.M00*m->MM.M11 - m->MM.M10*m->MM.M01)>>15)+(1<<(I_LEFT_MOVE-1)))>>I_LEFT_MOVE;
  
  // return success
  return(1);

} 

//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -