您的位置:首页 > 其它

WPF中3D旋转的实现

2010-04-27 14:11 246 查看
关于3D旋转的原理,请看Daniel Lehenbauer的文章

《Rotating the Camera with the Mouse》

http://viewport3d.com/trackball.htm

里面非常清楚的讲解了原理和方法,很受用。

相关代码:

2.1 Finding the Point on the Sphere

private Vector3D ProjectToTrackball(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 z2 = 1 - x * x - y * y; // z^2 = 1 - x^2 - y^2
Double z = z2 > 0 ? Math.Sqrt(z2) : 0;
return new Vector3D(x, y, z);
}

2.2 Rotating Between the Points

private void Rotate(Point currentPosition)
{
Vector3D currentPosition3D = ProjectToTrackball(EventSource.ActualWidth, EventSource.ActualHeight, currentPosition);

Vector3D axis = Vector3D.CrossProduct(_previousRotPosition3D, currentPosition3D);
Double angle = Vector3D.AngleBetween(_previousRotPosition3D, currentPosition3D);

Rotate(axis, angle);

_previousRotPosition3D = currentPosition3D;
}

private void Rotate(Vector3D axis, Double angle)
{
Quaternion delta = new Quaternion(axis, -angle * _rotScale);

Quaternion q = new Quaternion(_axisAngleRotation3D.Axis, _axisAngleRotation3D.Angle);

q *= delta;

Vector3D zeorVec = new Vector3D(0.0, 0.0, 0.0);
if (Vector3D.Equals(q.Axis, zeorVec))
return;

_axisAngleRotation3D.Axis = q.Axis;
_axisAngleRotation3D.Angle = q.Angle;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: