EaBIM
标题: 3D场景中Camera的旋转 [打印本页]
作者: 萧闫子 时间: 2014-1-9 14:40
标题: 3D场景中Camera的旋转
很多人想达到3D场景中,基于鼠标控制的Camera任意角度旋转,其实不难,分为其下两步:
一、
基于鼠标移动过程的建模
这一步,在于你是如何理解mouse在一个二维平面从previousposition到currentpositon所表示的意图,网络上有一种很通用的方法“virtual trackball”。本人目前也是采用的这种方法,故而在这里简单介绍一下:
1.
直观感觉(Daniel Lehenbauer 主页)
Figure 1 Moving with mouse
2.
理解
把整个空间的场景先归一化到一个单位立方体,视野里的平面即为一个中心切面,鼠标在平面(2维空间)的坐标可以映射到一个三维球面上(注意:这里是映射到3维球面上,如果你有更好的模型,完全可以映射到更好的三维空间中),这样就理解成球面上的移动,进而产生旋转的效果。
这是2维平面点映射到3维球面点的方法:
private Vector3D TransTo3DPoint(Double width, Double height, Point point)
{
Double x = point.X / (width / 2); // Scale so bounds map to [0,0] - [2,2]
Double y = point.Y / (height / 2);
x = x - 1; // Translate 0,0 to the center
y = 1 - y; //Flip so y is up instead of down
Double ztemp = 1 - x * x - y * y; // z^2 + x^2 - y^2 = 1
Double z = ztemp > 0 ? Math.Sqrt(ztemp) : 0;
return new Vector3D(x, y, z);
}
3.
根据模型球面上初始点和当前点,得到旋转轴和旋转角度,调用旋转Camera的方法,即可实现空间中的所有场景的自由旋转。
private void Rotate(Point currentPosition)
{
// Call the TransTo3DPoint to get the currentPosition3D
Vector3D currentPosition3D = TransTo3DPoint(GoWindow.ActualWidth, GoWindow.ActualHeight, currentPosition);
// Call Vector3D.CrossProduct to realize the 叉乘
Vector3D axis = Vector3D.CrossProduct(previousPosition3D, currentPosition3D);
// Call Vector3D.AngleBetween to achieve the angle between two vectors
Double angle = Vector3D.AngleBetween(previousPosition3D, currentPosition3D);
// rotate the camera
RotateCamera(axis, angle);
// erery time we should reset the previousPosition
previousPosition3D = currentPosition3D;
}
二、
基于旋转向量和旋转角度的Camera旋转
首先需要定义Camera的旋转方式(我之前找这个无果,想到了用旋转矩阵这种方法,套用了一堆3维空间的坐标系旋转公式,效果并不理想):
<PerspectiveCamera.Transform>
<Transform3DGroup>
<RotateTransform3D x:Name="axisYRTransform">
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="axisYRotation" Angle="0" Axis="0 1 0" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</Transform3DGroup>
</PerspectiveCamera.Transform>
那么接下来要做的就是写上一个小小的函数用来旋转特定的Camera了:
private void RotateCamera(Vector3D axis, Double angle)
{
Vector3D vecZero = new Vector3D(0.0,0.0,0.0);
if (vecZero == axis || 0 == angle)
return;
Quaternion delta = new Quaternion(axis, angle);
// axisYRotation is the name of camera AxisAngleRotation3D
Quaternion q = new Quaternion(axisYRotation.Axis, axisYRotation.Angle);
q *= delta;
if (Vector3D.Equals(q.Axis, vecZero))
return;
axisYRotation.Axis = q.Axis;
axisYRotation.Angle = q.Angle;
}
作者: 冰山 时间: 2014-2-27 14:42
路过!!!
不发表意见……
作者: 一梦千寻 时间: 2014-2-27 14:45
路过!!!
不发表意见……
作者: 秦惑 时间: 2014-2-27 14:53
顶!!!!!!!!!!
作者: leowave 时间: 2014-2-27 15:01
路过!!!
帮顶……
作者: 孙雅 时间: 2014-2-28 12:05
顶起来…………
作者: 筱雅 时间: 2014-2-28 12:07
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 筱雅 时间: 2014-3-4 14:24
路过!!!
帮顶……
作者: lw7511 时间: 2014-3-5 16:42
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 极HONDA速 时间: 2014-3-5 16:45
顶!!!!!!!!!!
作者: 江枫 时间: 2014-3-5 16:46
路过!!!
帮顶……
作者: 悠悠筱荷 时间: 2014-3-5 16:49
顶起来…………
作者: 严英华 时间: 2014-3-26 16:17
顶!!!!!!!!!!
作者: 教父 时间: 2014-4-1 10:37
(*^__^*) 嘻嘻……
作者: 泰安oim 时间: 2014-4-1 10:39
顶!!!!!!!!!!
作者: 雁田佬 时间: 2014-4-1 10:41
路过!!!
帮顶……
作者: 一梦千寻 时间: 2014-4-1 10:43
路过!!!
不发表意见……
作者: 筱雅 时间: 2014-4-1 10:47
路过!!!
帮顶……
作者: 泰安oim 时间: 2014-4-1 10:49
路过!!!
帮顶……
作者: 国产008 时间: 2014-5-6 11:02
路过!!!
帮顶……
作者: EaBIM门户编辑 时间: 2015-1-19 10:52
看看
作者: 萧闫子 时间: 2015-3-27 09:05
感谢分享
作者: EaBIM门户编辑 时间: 2015-7-14 11:14
顶!!
作者: EaBIM门户编辑 时间: 2015-7-16 10:13
赞赞赞赞!!
作者: 嘻00哈 时间: 2015-8-7 10:40
好东西!支持一下
作者: 嘻00哈 时间: 2015-8-7 10:41
好东西!支持一下
作者: EaBIM门户编辑 时间: 2015-8-13 11:34
赞噢!
作者: EaBIM门户编辑 时间: 2015-8-25 10:39
不错噢!
作者: EaBIM门户编辑 时间: 2015-9-7 13:43
不错,不错!
作者: 萧闫子 时间: 2015-9-13 09:24
感谢分享
作者: EaBIM门户编辑 时间: 2015-11-9 11:20
不错!
作者: EaBIM门户编辑 时间: 2015-11-12 11:37
很好!
作者: 妮可 时间: 2016-1-14 09:24
好!!~~~
作者: EaBIM门户编辑 时间: 2016-1-20 11:26
挺好的!
作者: 妮可 时间: 2016-2-23 09:41
顶!d=====( ̄▽ ̄*)b
作者: EaBIM门户编辑 时间: 2016-3-10 14:01
不错!
作者: 妮可 时间: 2016-3-25 10:46
<( ̄︶ ̄)> 不错o!~
作者: EaBIM门户编辑 时间: 2016-8-29 10:21
好样的
作者: EaBIM门户编辑 时间: 2016-9-22 09:18
不错啊
作者: EaBIM门户编辑 时间: 2016-10-24 09:24
不错
作者: EaBIM门户编辑 时间: 2016-11-2 09:19
大赞
作者: EaBIM门户编辑 时间: 2016-11-16 09:24
不错
作者: EaBIM门户编辑 时间: 2016-12-7 09:09
非常好
作者: EaBIM门户编辑 时间: 2017-1-12 09:47
很不错
作者: EaBIM门户编辑 时间: 2017-1-12 09:47
很不错
作者: EaBIM门户编辑 时间: 2017-1-16 10:20
不错
作者: EaBIM门户编辑 时间: 2017-3-1 09:24
很赞
作者: EaBIM门户编辑 时间: 2017-4-6 10:07
努力学习
作者: EaBIM门户编辑 时间: 2017-5-3 09:52
来学习一下
作者: EaBIM门户编辑 时间: 2017-7-4 16:52
分享不错
作者: EaBIM门户编辑 时间: 2017-7-27 10:02
分享是种美德
欢迎光临 EaBIM (https://eabim.net/) |
Powered by Discuz! X3.2 |