当用户将鼠标/手指移到球体上时,我试图让我的 3D 球体旋转。
我可以让它旋转没有问题,但是当我尝试使用 Surface SDK 中的 Affine2DInertiaProcessor 向球体添加惯性时,当我快速轻弹球体时会出现跳跃问题,我不知道为什么......
这是我的初始化代码:
private void InitializeManipulationProcessor()
{
manipulationProcessor = new Affine2DManipulationProcessor(
Affine2DManipulations.Rotate |
Affine2DManipulations.TranslateX |
Affine2DManipulations.TranslateY,
_eventSource);
inertiaProcessor = new Affine2DInertiaProcessor();
inertiaProcessor.Affine2DInertiaDelta += Inertia_OnManipulationDelta;
inertiaProcessor.Affine2DInertiaCompleted += InertiaProcessor_Affine2DInertiaCompleted;
manipulationProcessor.Affine2DManipulationStarted += OnManipulationStarted;
manipulationProcessor.Affine2DManipulationDelta += Manipulation_OnManipulationDelta;
manipulationProcessor.Affine2DManipulationCompleted += OnManipulationCompleted;
}
当用户移动手指时,以下是旋转球体的代码:
private void Manipulation_OnManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
{
Point currentPosition = e.ManipulationOrigin;
// avoid any zero axis conditions
if (currentPosition == _previousPosition2D)
return;
Track(currentPosition);
_previousPosition2D = currentPosition;
}
当用户停止移动手指时,这将启动 ineria:
private void OnManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
{
inertiaProcessor.InitialOrigin = e.ManipulationOrigin;
inertiaProcessor.InitialVelocity = e.Velocity;
inertiaProcessor.DesiredDeceleration = 0.0001;
inertiaProcessor.Begin();
}
旋转的魔力发生在下面的Track方法中:
private void Track(Point currentPosition)
{
Vector3D currentPosition3D = ProjectToTrackball(currentPosition);
Vector3D axis = Vector3D.CrossProduct(_previousPosition3D, currentPosition3D);
double angle = Vector3D.AngleBetween(_previousPosition3D, currentPosition3D);
// quaterion will throw if this happens - sometimes we can get 3D positions that
// are very similar, so we avoid the throw by doing this check and just ignoring
// the event
if (axis.Length == 0)
return;
Quaternion delta = new Quaternion(axis, -angle);
// Get the current orientantion from the RotateTransform3D
Quaternion q = new Quaternion(_rotation.Axis, _rotation.Angle);
// Compose the delta with the previous orientation
q *= delta;
// Write the new orientation back to the Rotation3D
_rotation.Axis = q.Axis;
_rotation.Angle = q.Angle;
_previousPosition3D = currentPosition3D;
}
_rotation var 是用于3d 网格上的RotateTransform3D的AxisAngleRotation3D类。
我知道这是一个特殊情况,但我感觉这是一个计算问题,我真的不知道如何调试它。
还有一件事,要注意的一件非常有趣的事情是,如果我慢慢地轻弹地球仪,我不会有任何跳跃,而且非常平稳!所以它必须与大型计算有关,或者只是一些错误......
如果你擅长 3D 旋转并且真的相信你可以提供帮助,那么我很乐意将这个项目打包成 ZIP 并发送给你,如果你需要更好的格式来使用它
感谢您提供的任何帮助,我非常感谢您的帮助!
标记