Canbitwell Products

Yuri'Blog +[基于冲量物理实时模拟] [碰撞检测]
posts - 12, comments - 10, trackbacks - 0, articles - 1
   :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

四元数摄像机

Posted on 2007-07-01 22:32 Yuri 阅读(222) 评论(0)  编辑 收藏 网摘 所属分类: Engine

无万向锁,旋转绝对自由。就是不好控制

BTW:这是渲染引擎部件之一。CCamera可以用于设置RenderTarget,而CViewerCamera则是给用户3D漫游用的

public class CCamera
    
{
        Matrix4x4 mViewMatrix, mProjMatrix;

        
protected Vector mPosition;
        
protected Quaternion mOri;

        
protected Vector mFront;
        
protected Vector mTop;
        
protected Vector mRight;

        
double mFovy;
        
double mNear;
        
double mFar;
        
double mAspect;

        CFrustum mFrustum 
= new CFrustum();
 

        
/// <summary>
        
/// 摄像机Z
        
/// </summary>


        
public Vector Front
        
{
            
get return mFront; }
        }

        
/// <summary>
        
/// 摄像机Y
        
/// </summary>

        public Vector Top
        
{
            
get return mTop; }
        }

        
/// <summary>
        
/// 摄像机X
        
/// </summary>

        public Vector Right
        
{
            
get return mRight; }
        }


        
public Vector Position
        
{
            
get return mPosition; }
            
set { mPosition = value; }
        }


        
public Quaternion Orientation
        
{
            
get return mOri; }
            
set { mOri = value; }
        }


        
public double Fovy
        
{
            
get return mFovy; }
            
set { mFovy = value; }
        }


        
public double Near
        
{
            
get return mNear; }
            
set { mNear = value; }
        }


        
public double Far
        
{
            
get return mFar; }
            
set { mFar = value; }
        }


        
public double Aspect
        
{
            
get return mAspect; }
            
set { mAspect = value; }
        }


        
public CCamera(double aspect)
        
{
            mFar 
= 2500;
            mFovy 
= 45;
            mNear 
= 1;
            mAspect 
= aspect;
            mOri 
= Quaternion.Inentity;
            Update();
        }


        
public void UpdateProjection()
        
{
            mProjMatrix 
= Matrix4x4.GetProjectionMatrix(mFovy, mAspect, mNear, mFar);
        }


        
public void Update()
        
{
            mViewMatrix 
= Matrix4x4.GetTranslateMatrix(-mPosition) * mOri.ToMatrix4(new Vector());
            mProjMatrix 
= Matrix4x4.GetProjectionMatrix(mFovy, mAspect, mNear, mFar);
            mFrustum.Update(mViewMatrix, mProjMatrix);

            Matrix3x3 rot 
= mOri.ToMatrix3();
            mFront 
= rot * new Vector(001);
            mTop 
= rot * new Vector(010);
            mRight 
= rot * new Vector(100);
        }


        
public Matrix4x4 ProjMatrix
        
{
            
get return mProjMatrix; }
            
set { mProjMatrix = value; }
        }


        
public Matrix4x4 ViewMatrix
        
{
            
get return mViewMatrix; }
            
set { mViewMatrix = value; }
        }

}


public class CViewerCamera : CCamera
    
{
        
public CViewerCamera(double aspect)
            : 
base(aspect)
        
{ }

        
protected double mMoveSpeed = 2.5;
        
protected double mTurnSpeed = Math.PI / 45;

        
public double MoveSpeed
        
{
            
get return mMoveSpeed; }
            
set { mMoveSpeed = value; }
        }


        
public double TurnSpeed
        
{
            
get return mTurnSpeed; }
            
set { mTurnSpeed = value; }
        }


        
public void MoveAbs(Vector mov)
        
{
            mPosition 
+= mOri.ToMatrix3() * mov;
        }

 
        
public void MoveFront()
        
{ mPosition += mFront * mMoveSpeed; }

        
public void MoveBack()
        
{ mPosition -= mFront * mMoveSpeed; }

        
public void MoveLeft()
        
{ mPosition -= mRight * mMoveSpeed; }

        
public void MoveRight()
        
{ mPosition += mRight * mMoveSpeed; }

        
public void MoveUp()
        
{
            mPosition 
+= mTop * mMoveSpeed;
        }


        
public void MoveDown()
        
{
            mPosition 
-= mTop * mMoveSpeed;
        }


        
public void TurnLeft()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(0-10));
            mOri.Normalize();
        }


        
public void TurnRight()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(010));
            mOri.Normalize();
        }


        
public void TurnUp()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(-100));
            mOri.Normalize();
        }


        
public void TurnDown()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(100));
            mOri.Normalize();
        }


        
public void RollLeft()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(001));
            mOri.Normalize();
        }


        
public void RollRight()
        
{
            mOri 
*= Quaternion.FromAngleAxis(mTurnSpeed, new Vector(00-1));
            mOri.Normalize();
        }


    }


 


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: