|
|
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(0, 0, 1);
mTop = rot * new Vector(0, 1, 0);
mRight = rot * new Vector(1, 0, 0);
}

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, -1, 0));
mOri.Normalize();
}

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

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

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

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

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

}
|