VIEWPORT3D中的摄像机(二 摄像机动作)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

和移动摄像机不同,旋转摄像机时,保持摄像机的 Position 属性不变,根据旋转值修改摄像机的 LookDirection 属性。这里仅仅假设绕 Y 轴旋转:
/// <summary> /// 旋转摄像头 /// </summary> /// <param name="ModelCameraAction">旋转角度</param> public void Turn(SceneCameraAction ModelCameraAction) {
0,
-Math.Sin(x), Math.Cos(x), 0,
0,
0,
0,
1);
Matrix3D rotateY = new Matrix3D(
Math.Cos(y), 0,
0,
1,
Math.Sin(y), 0,
0,
0,
-Math.Sin(y), 0,
0,
0,
Math.Cos(y), 0,
0,
1);
public enum SceneCameraAction
{
MoveForward, //向前移动
MoveBack,
//向后移动
MoveLeft,
//向左移动
MoveRight,
//向后移动
MoveUp,
//向上移动
MoveDown,
//向下移动
TurnLeft,
//左转
TurnRight,
//右转
}
if (ModelCameraAction == SceneCameraAction.TurnRight) {
Camera.LookDirection = Camera.LookDirection.Rotate(0, -1 * speed, 0).GetUnit();
} }
/// <summary>
/// 向量旋转
/// </summary>
/// <param name="x">绕 x 轴旋转值</param>
/// <param name="y">绕 y 轴旋转值</param>
/// <param name="z">绕 z 轴旋转值</param>
/// <returns>旋转结果</returns>
Matrix3D rotateZ = new Matrix3D(
Math.Cos(z), Math.Sin(z), 0,
0,
-Math.Sin(z), Math.Cos(z), 0,
0,
0,
0,
1,
0,
0,
0,
0,
1);
return vector3D * rotateX * rotateY * rotateZ;
下图为摄像机向前、向左、向上移动的方向,为了方便计算,移动方向都为单位向量。
向前移动的移动方向为 LookDirection,向后为-1*LookDirection 向前移动: Camera.Position += (Speed * Camera.LookDirection); 向后移动 Camera.Position -= (Speed * Camera.LookDirection); 向左、向右移动,相当于在 XZ 平面上,沿着摄像机的 LookDirection 投影垂直的直线方向移动。 向左移动: Camera.Position += Speed * (Camera.LookDirection.Rotate(0, Math.PI / 2, 0).GetUnit()); 向右移动:
Camera.Position += Speed * (Camera.LookDirection.Rotate(0, -1 * Math.PI / 2, 0).GetUnit()); 上面的变换,我用了两个扩展函数:
把向量旋转拆分成分别绕 x 轴、y 轴、z 轴旋转:
用以下函数计算一个向量分别绕 x、y、z 轴旋转后得到的新向量:
TurnUp,
//向上看
TurnDown,
//向下看
ZoomIn,
//拉近镜头
ZoomOut,
//拉远镜头
}
在 WPF3D 里,可以通过改变计算机的 Position 属性,来移动 PerspectiveCamera,假设摄像机的移 动速度为 Speed,有以下移动公式:
新坐标=原坐标+速度×移动方向
vector3D.Y * length / vector3D.Length, vector3D.Z * length / vector3D.Length); }
向上、向下移动相当于延 y 轴改变 Camera 的 Position 属性: 向上移动: Camera.Position += Speed * new Vector3D(0, 1, 0); 向下移动: Camera.Position += Speed * new Vector3D(0, -1, 0);
public static Vector3D Rotate(this Vector3D vector3D,double x, double y, double z) {
Matrix3D rotateX = new Matrix3D(
1,
0,
0,
0,
0,
Math.Cos(x), Math.Sin(x), 0,
在 3D 场景里漫游,最主要的工作就是针对用户输入(例如鼠标左右移动、键盘按下 A、W、S、D 等 键)来改变摄像机的位置、方向。本文接下来介绍如何通过改变 PerspectiveCamera 的属性,来达到 场景的漫游效果。
我摄像机的动作可以分成三类、移动、旋转、拉升镜头。用一个枚举来描述这些动作:
百度文库} GetUnit 函数是计算一个响亮的单位向量:
public static Vector3D GetUnit(this Vector3D vector3D) {
double length = 1.0d; return new Vector3D(vector3D.X * length / vector3D.Length,
double speed = Math.PI / 60;
if (ModelCameraAction == SceneCameraAction.TurnLeft) {
Camera.LookDirection = Camera.LookDirection.Rotate(0, speed, 0).GetUnit();
相关文档
最新文档