WPF中3D旋转的实现

原文:WPF中3D旋转的实现

关于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;
??????? }

原文地址:https://www.cnblogs.com/lonelyxmas/p/9844859.html

时间: 2024-10-12 12:05:40

WPF中3D旋转的实现的相关文章

WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能

原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能 ????? 对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了讲解,可以参考Daniel. ????? 今天说一下CAD的2D旋转,2D旋转虽然不如3D那么常用,但也是CAD操作的基本功能需要实现.刚开始的做法是觉得用AxisAngleRotation3D没法实现2D旋转,所以用RotateTransform去实现.但是用它遇到的问题是旋转的transform没有考虑在

在WPF中绘制多维数据集

原文 https://stuff.seans.com/2008/08/13/drawing-a-cube-in-wpf/ 是时候使用WPF绘制一个简单的3D对象了.作为WPF中3D图形的快速介绍,让我们只渲染一个最简单的对象 - 一个立方体. 在这个例子中,我将直接在XAML中定义我们需要的所有内容.与WPF中的其他内容一样,我们可以直接在代码中完成所有这些操作.但是在XAML中定义所有内容更加清晰,因为它使对象层次结构更加明显.在实际项目中,您显然会在代码中执行此操作,例如创建或加载3D网格(

WPF中使用TranslateTransform3D修改CAD的3D旋转中心

原文:WPF中使用TranslateTransform3D修改CAD的3D旋转中心 ?????? 前面一篇文章讲述了2D旋转功能的实现,文章提到了修改3D旋转中心,这一节主要总结一下具体的修改3D旋转中心的实现方法.(这个功能的实现有一段时间了,需要通过代码好好总结一下) ????? TranslateTransform3D以相对容器的偏移移动对象,通过OffsetX.OffsetY.OffsetZ属性来指定偏移量. ? (1)定义对象 ??????? private TranslateTran

在WPF中使用PlaneProjection模拟动态3D效果

原文:在WPF中使用PlaneProjection模拟动态3D效果 虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景.毕竟使用3D引擎会消耗很多资源,有时候使用各种变换和假的阴影贴图也能设计出既省资源,又有很好用户体验的“伪”3D界面. 在Silverlight中,因为性能问题,一般并不使用真3D引擎,微软为Silverlight提供了System.Windows.Media.PlaneProjection 类,用投影变换来模拟3D的效果. 下面让我们看

WPF中的3D Wireframe

原文:WPF中的3D Wireframe WPF不支持画三维线,但开发人员提供了ScreenSpaceLines3D 类用于实现这个功能.我已经在程序中实现并成功显示3D Wireframe,并能够进行3D Solid和3D Wireframe的切换. 我在熟悉这个类的基础上,自己定义了3D Wireframe xml文件的格式,用于保存3D Wireframe数据. 格式如下: <Wireframe>? <ScreenSpaceLines3D??? Form="Generic

WPF中对三维模型的控制

原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完成对三维造型的贴图和控制设计.本例在3Dmax中设计了1个双翼开瓶器模型,将"开瓶器.obj"和贴图材质文件都添加到项目中("素材"文件夹).图2-206 的左侧是"开瓶器.obj"文件拖入到[设计面板]后,在[对象和时间线]面板中看到的结构,右侧是

WPF中的三维空间(2)

原文:WPF中的三维空间(2) 2.10.3 三维对象操作 1.在二维平面空间移动.缩放.旋转Viewport3D控件对象         图2-196 选中Viewport3D控件对象      图2-197 二维平面空间中对象操作图标 [设计面板]实际上是X-Y平面,在[对象和时间线]面板上选中Viewport3D控件对象,同时选中[工具]面板中的"选择"工具,在[设计面板]中的选中的对象被平面蓝色边框(称二维边框)包围,边框上有8个选择点,如图2-196所示.图的中央有1个点是对

WPF中的三维空间(1)

原文:WPF中的三维空间(1) WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设置颜色或贴图. 2.10.1 WPF中的三维空间 1.三维空间坐标 WPF中二维图形的坐标系原点定位在呈现区域(屏幕)的左上角,其X 轴上的正方向朝右,Y轴的正向朝下. 在WPF的三维坐标系中,原点一般位于在WPF中创建的三维对象的中心(导入的三维对象的情况就不一定了,比如从3DMax中导入的obj

WPF中的简单水动画

原文 https://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/ 很多年前(80年代中期),我在一家拥有Silicon Graphics工作站的公司工作.在旨在展示SGI机器高端图形的少数演示中,有一个模拟了一个小线框网格中的波传播.通过更改网格中的点的高度然后让模拟运行来玩游戏非常有趣.并且SGI机器足够快,结果动画只是令人着迷. 在WPF中重新创建这个水模拟似乎是一个很好的方式来学习WPF中的3D图形.(最终结果在这里)