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

📄 our_3d.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************
Copyright (C) jianbo miao Corporation.  All Rights Released.
this is a 3d engin named our_3d_engin.
our_3d_engin feature:
1:there is no float.
2:it do the 3d things all by softwear.
3:base on 1 and 2 , it can execution on arm which have no 3d hardwear accelerate.

  if you have any  suggestion or question,pls contact with me
  mail:miaojb@126.com
  msn:miaojianbo@hotmail.com
  qq:30209027
  
    2008/01/01
***************************************************************************/

#ifndef OUR_3D_C
#define OUR_3D_C

#include "our_math.h"
#include "our_3d.h"
#include "our_draw32.h"
#include "our_draw16.h"
#include "math.h"


UINT OUR_D_FrameTH;
UINT OUR_D_point_changed_num;
UINT OUR_D_triangle_drawed_num;
int OUR_D_screem_w;
int OUR_D_screem_h;

//-----------------------------
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
//FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF


//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

void OUR_Build_XYZ_Rotation_MATRIX3X3(	FIXP16 theta_x, 	 //60t 450t  850t
                                      FIXP16 theta_y, 
                                      FIXP16 theta_z,
                                      FIX_MATRIX_3X3_PTR mrot) // output 
{
    
    FIX_MATRIX_3X3 mx, my, mz, mtmp;  	// working matrices
    FIXP16 sin_theta=0, cos_theta=0;   	// used to initialize matrices
    int rot_seq = 0;                  		// 1 for x, 2 for y, 4 for z
    
    // step 1: based on zero and non-zero rotation angles, determine
    // rotation sequence
    if (theta_x != 0) 						// x
        rot_seq = rot_seq | 1;
    
    if (theta_y != 0) 						// y
        rot_seq = rot_seq | 2;
    
    if (theta_z != 0) 						// z
        rot_seq = rot_seq | 4;
    
    
    switch(rot_seq)						// now case on sequence
    {
    case 0: 							// no rotation
        {
            mrot->MM.M00=1<<FIXP15_SHIFT;	mrot->MM.M01=0;		mrot->MM.M02=0;	
            mrot->MM.M10=0;		mrot->MM.M11=1<<FIXP15_SHIFT;	mrot->MM.M12=0;	
            mrot->MM.M20=0;		mrot->MM.M21=0;		mrot->MM.M22=1<<FIXP15_SHIFT;		
            return;
        }
        
    case 1: // x rotation
        {	
            // compute the sine and cosine of the angle
            cos_theta = 	OUR_Fast_Cos(theta_x);
            sin_theta = 	OUR_Fast_Sin(theta_x);
            mrot->MM.M00=1<<FIXP15_SHIFT;	mrot->MM.M01=0;		mrot->MM.M02=0;	
            mrot->MM.M10=0;		mrot->MM.M11=cos_theta;	mrot->MM.M12=sin_theta;	
            mrot->MM.M20=0;		mrot->MM.M21=-sin_theta;	mrot->MM.M22=cos_theta;
            return;
            
        }
        
    case 2: // y rotation
        {
            cos_theta = 	OUR_Fast_Cos(theta_y);
            sin_theta = 	OUR_Fast_Sin(theta_y);
            mrot->MM.M00=cos_theta;	mrot->MM.M01=0;		mrot->MM.M02=-sin_theta;	
            mrot->MM.M10=0;		mrot->MM.M11=1<<FIXP15_SHIFT;	mrot->MM.M12=0;	
            mrot->MM.M20=sin_theta;	mrot->MM.M21=0;		mrot->MM.M22=cos_theta;
            return;
            
        }
        
    case 3: // xy rotation
        {
            cos_theta = 	OUR_Fast_Cos(theta_x);
            sin_theta = 	OUR_Fast_Sin(theta_x);
            
            mx.MM.M00=1<<FIXP15_SHIFT;		mx.MM.M01=0;			mx.MM.M02=0;	
            mx.MM.M10=0;			mx.MM.M11=cos_theta;	mx.MM.M12=sin_theta;	
            mx.MM.M20=0;			mx.MM.M21=-sin_theta;	mx.MM.M22=cos_theta;
            
            cos_theta = 	OUR_Fast_Cos(theta_y);
            sin_theta = 	OUR_Fast_Sin(theta_y);
            
            my.MM.M00=cos_theta;	my.MM.M01=0;			my.MM.M02=-sin_theta;	
            my.MM.M10=0;			my.MM.M11=1<<FIXP15_SHIFT;		my.MM.M12=0;	
            my.MM.M20=sin_theta;	my.MM.M21=0;			my.MM.M22=cos_theta;
            
            OUR_FIX_Mat_Mul_3X3(&mx, &my, mrot);
            return;
            
        }
        
    case 4: // z rotation
        {
            cos_theta = 	OUR_Fast_Cos(theta_z);
            sin_theta = 	OUR_Fast_Sin(theta_z);
            
            mrot->MM.M00=cos_theta;	mrot->MM.M01=sin_theta;	mrot->MM.M02=0;	
            mrot->MM.M10=-sin_theta;	mrot->MM.M11=cos_theta;	mrot->MM.M12=0;	
            mrot->MM.M20=0;		mrot->MM.M21=-0;		mrot->MM.M22=1<<FIXP15_SHIFT;
            return;
            
        }
        
    case 5: // xz rotation
        {
            cos_theta = 	OUR_Fast_Cos(theta_x);
            sin_theta = 	OUR_Fast_Sin(theta_x);
            
            mx.MM.M00=1<<FIXP15_SHIFT;		mx.MM.M01=0;			mx.MM.M02=0;	
            mx.MM.M10=0;			mx.MM.M11=cos_theta;	mx.MM.M12=sin_theta;	
            mx.MM.M20=0;			mx.MM.M21=-sin_theta;	mx.MM.M22=cos_theta;		
            
            cos_theta = 	OUR_Fast_Cos(theta_z);
            sin_theta = 	OUR_Fast_Sin(theta_z);
            
            mz.MM.M00=cos_theta;	mz.MM.M01=sin_theta;		mz.MM.M02=0;	
            mz.MM.M10=-sin_theta;	mz.MM.M11=cos_theta;	mz.MM.M12=0;	
            mz.MM.M20=0;			mz.MM.M21=-0;			mz.MM.M22=1<<FIXP15_SHIFT;
            
            OUR_FIX_Mat_Mul_3X3(&mx, &mz, mrot);
            return;
            
        }
        
    case 6: // yz rotation
        {
            
            cos_theta = 	OUR_Fast_Cos(theta_y);
            sin_theta = 	OUR_Fast_Sin(theta_y);
            
            my.MM.M00=cos_theta;	my.MM.M01=0;			my.MM.M02=-sin_theta;	
            my.MM.M10=0;			my.MM.M11=1<<FIXP15_SHIFT;		my.MM.M12=0;	
            my.MM.M20=sin_theta;	my.MM.M21=0;			my.MM.M22=cos_theta;
            
            cos_theta = 	OUR_Fast_Cos(theta_z);
            sin_theta = 	OUR_Fast_Sin(theta_z);
            
            mz.MM.M00=cos_theta;	mz.MM.M01=sin_theta;	mz.MM.M02=0;	
            mz.MM.M10=-sin_theta;	mz.MM.M11=cos_theta;	mz.MM.M12=0;	
            mz.MM.M20=0;			mz.MM.M21=-0;			mz.MM.M22=1<<FIXP15_SHIFT;
            
            OUR_FIX_Mat_Mul_3X3(&my, &mz, mrot);
            
            return;
            
        }
        
    case 7: // xyz rotation
        {	
            cos_theta = 	OUR_Fast_Cos(theta_x);
            sin_theta = 	OUR_Fast_Sin(theta_x);
            
            mx.MM.M00=1<<FIXP15_SHIFT;		mx.MM.M01=0;			mx.MM.M02=0;	
            mx.MM.M10=0;			mx.MM.M11=cos_theta;	mx.MM.M12=sin_theta;	
            mx.MM.M20=0;			mx.MM.M21=-sin_theta;	mx.MM.M22=cos_theta;	
            
            cos_theta = 	OUR_Fast_Cos(theta_y);
            sin_theta = 	OUR_Fast_Sin(theta_y);
            
            my.MM.M00=cos_theta;	my.MM.M01=0;			my.MM.M02=-sin_theta;	
            my.MM.M10=0;			my.MM.M11=1<<FIXP15_SHIFT;		my.MM.M12=0;	
            my.MM.M20=sin_theta;	my.MM.M21=0;			my.MM.M22=cos_theta;
            
            cos_theta = 	OUR_Fast_Cos(theta_z);
            sin_theta = 	OUR_Fast_Sin(theta_z);
            
            mz.MM.M00=cos_theta;	mz.MM.M01=sin_theta;	mz.MM.M02=0;	
            mz.MM.M10=-sin_theta;	mz.MM.M11=cos_theta;	mz.MM.M12=0;	
            mz.MM.M20=0;			mz.MM.M21=-0;			mz.MM.M22=1<<FIXP15_SHIFT;
            
            OUR_FIX_Mat_Mul_3X3(&mx, &my, &mtmp);
            OUR_FIX_Mat_Mul_3X3(&mtmp, &mz, mrot);
            return;
            
        }
        
    default: break;
} 
return;

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

void OUR_XYZ_Rotation_OBJ(	FIXP16 x, // 1300t
                          FIXP16 y, 
                          FIXP16 z,
                          OUR_3D_OBJ_PTR obj,
                          int obj_r_style)// output 
{	
    FIX_MATRIX_3X3 mx;
    obj->state_attr |= OBJ_CHANGED;
    if(OBJ_R_XYZ==obj_r_style)
    {
        OUR_Build_XYZ_Rotation_MATRIX3X3(x, y, z,&obj->mrot); 
    }
    else if(OBJ_R_XYZ_ADD==obj_r_style)
    {
        OUR_Build_XYZ_Rotation_MATRIX3X3(x, y, z,&mx); 
    }
    OUR_Mat_Inverse_3X3(&obj->mrot,&obj->mrot_i);
    
}
//--------------------------------------------------------------------
//--------------------------------------------------------------------
void OUR_Build_CAM_Rotation_MATRIX3X3(OUR_3D_CAM_PTR cam)//1550
{
    FIX_POINT3D v;			//x
    FIX_POINT3D u={0,0,1};		//y
    FIX_POINT3D n;			//z
    
    OUR_FIX_VECTOR3D_SUB(&(cam->target),&(cam->pos),&n);
   // OUR_VECTOR3D_Cross(&u, &n, &v);
    
    v.MM.x=n.MM.z;//???
    v.MM.y=0;
    v.MM.z=-n.MM.x;
    
    OUR_VECTOR3D_Cross( &n, &v,&u);
    
    //OUR_VECTOR3D_Cross( &v, &u,&n);
    
    OUR_VECTOR3D_Normalize(&n);
    OUR_VECTOR3D_Normalize(&v);
    OUR_VECTOR3D_Normalize(&u);
    
    cam->mrot.MM.M00=v.MM.x;
    cam->mrot.MM.M01=u.MM.x;
    cam->mrot.MM.M02=n.MM.x;
    
    cam->mrot.MM.M10=v.MM.y;
    cam->mrot.MM.M11=u.MM.y;
    cam->mrot.MM.M12=n.MM.y;
    
    cam->mrot.MM.M20=v.MM.z;
    cam->mrot.MM.M21=u.MM.z;
    cam->mrot.MM.M22=n.MM.z;
    
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void OUR_POINT_CHANGE_OBJ(OUR_3D_OBJ_PTR obj,OUR_3D_CAM_PTR cam)//300t
{
    UINT  i;
    int  dvr;
    FIX_POINT3D pos;
    FIX_POINT3D pos_cam={0,0,1000};
    FIX_POINT3D_PTR p_p;
    FIX_MATRIX_3X3 mrot;
    
    p_p=obj->pPoints;	
    OUR_3Dengin_SET_LCD_B(cam->width<<1,cam->hight<<1);
    OUR_FIX_Mat_Mul_3X3(&obj->mrot,&(cam->mrot),&mrot);
    
    OUR_FIX_VECTOR3D_SUB(&obj->pos,&cam->pos,&pos);		//20t
    OUR_FIX_Mat_Mul_VECTOR3D_3X3(&pos, &(cam->mrot),&pos_cam);	//100t
    
    for(i=0;i<obj->point_num;i++)												
    {
        if(OUR_D_FrameTH==obj->pPoints_changed[i]) //whitch p would be changed
        {
            OUR_FIX_Mat_Mul_VECTOR3D_3X3(&p_p[i], &mrot,&obj->pPoints_work[i]);			//100t
            obj->pPoints_work[i].MM.x=(obj->pPoints_work[i].MM.x *obj->scale_x)>>SCALE_1;
            obj->pPoints_work[i].MM.y=(obj->pPoints_work[i].MM.y *obj->scale_y)>>SCALE_1;
            obj->pPoints_work[i].MM.z=(obj->pPoints_work[i].MM.z *obj->scale_z)>>SCALE_1;
            OUR_FIX_VECTOR3D_ADD(&obj->pPoints_work[i],&pos_cam,&obj->pPoints_work[i]);	//20t
            
            if(MATERIAL_pre_z) //& (obj->state_attr)
            {
                dvr=((cam->focus)<<15)/(obj->pPoints_work[i].MM.z);			
                
                obj->pPoints_work[i].MM.x=((obj->pPoints_work[i].MM.x*dvr)>>15)+cam->width;
                obj->pPoints_work[i].MM.y=cam->hight-((obj->pPoints_work[i].MM.y*dvr)>>15);	
            }
            else 
            {
                dvr=((cam->focus)<<15)/(cam->pos.MM.z);			
                
                obj->pPoints_work[i].MM.x=((obj->pPoints_work[i].MM.x*dvr)>>15)+cam->width;
                obj->pPoints_work[i].MM.y=cam->hight-((obj->pPoints_work[i].MM.y*dvr)>>15);	
                //obj->pPoints_work[i].MM.x=0xffffffff;
                //obj->pPoints_work[i].MM.y=0xffffffff;
            }
            obj->pPoints_work[i].MM.z=dvr;//keep the 1/z for bmp_fill
            OUR_D_point_changed_num++;
        }
    }
    
}
//--------------------------------------------------------------------

void OUR_INIT_Triangle_Normal(	OUR_3D_OBJ_PTR obj ) //570*n t	 需要优化								
{
    UINT  i;
    int  n1,n2,n3;
    FIX_POINT3D p1,p2;
    UINT  num;
    OUR_3D_TRAG_PTR triangle_list;
    num=obj->triangle_num;
    triangle_list=obj->pTriangle;
    for(i=0;i<num;i++)
    {
        n1=triangle_list[i].p1;
        n2=triangle_list[i].p2;
        n3=triangle_list[i].p3;
        OUR_FIX_VECTOR3D_SUB(&obj->pPoints[n2],&obj->pPoints[n1],&p1);
        OUR_FIX_VECTOR3D_SUB(&obj->pPoints[n3],&obj->pPoints[n1],&p2);
        OUR_VECTOR3D_Cross(&p1, &p2, &(triangle_list[i].NOR_P));
        if(i==793)
            n1++;
        //OUR_FAST_Normalize(&(triangle_list[i].NOR_P));
        OUR_VECTOR3D_Normalize(&(triangle_list[i].NOR_P));
    }
}


//--------------------------------------------------------------------
void OUR_INIT_Point_Normal(	OUR_3D_OBJ_PTR obj )//570*n t	 需要优化

{
    UINT  i,j;
    FIX_POINT3D p_nor;
    UINT  num_p,num_t;
    OUR_3D_TRAG_PTR triangle_list;
    FIX_POINT3D_PTR point_list;
    
    num_p=obj->point_num;
    num_t=obj->triangle_num;

⌨️ 快捷键说明

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