在做一个WPF集成SharpDX的功能。
遇见一个奇葩问题:MeshBuilder.AddBox(Point3D center, double xlength, double ylength, double zlength, BoxFaces faces);这个方法里面的BoxFaces 参数很让人迷惑。
查看了一下源码:
BoxFaces下有如下成员:
Top = PositiveZ,
Bottom = NegativeZ,
Left = NegativeY,
Right = PositiveY,
Front = PositiveX,
Back = NegativeX,
...
那么问题就来了,这里的Top 、Bottom 、Left 、Right 、Front 、Back 和主界面的ShowViewCube里那些F B L R U D所指的方向不一样。。
如图:
ShowViewCube(3D笛卡尔坐标系--右手) BoxFaces(3D柱面坐标系--右手)
这可咋整,让我好迷惑,以后这参数咋设置,乱七八糟的。。。
于是各种百度,最后在一篇博文里看到了对于3D坐标系的介绍,解决了我的问题。
到这里还没结束,用MeshBuilder.AddBox(Point3D center, double xlength, double ylength, double zlength, BoxFaces faces);添加的面(比如图片)
显示出来却是颠倒的,具体效果就是沿着X+方向顺时针旋转了90°,在这里再做一个逆旋转回去就行了。
RotateTransform3D rota = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 90));// 把笛卡尔坐标系的点反转回柱面坐标系(绕X+轴顺时针旋转90°)
Vector3D center = new Vector3D(10,10,10);
center = rota.Transform(center);
-----------------------------------------------------------------以下为引用--------------------------------------------------------------------------------------
(http://heweiyou.blog.51cto.com/5656256/1129911 感谢原博主的文章。。。)
3D笛卡尔坐标系故名思议则是在2D坐标系的基础上增加了一个维度,命名其为z轴,当然z轴也应有其正方向,因此出现了两种坐标系:左手坐标系(LHS)和右手坐标系(RHS)(用左手或右手握住z轴,如果其他手指从x轴绕到y轴,则大拇指将指向z轴的正方向)。
3D柱坐标系较为接近2D极坐标系,在r与θ的基础上多了一个z的值,如图:
其中:
x = r*cosθ
y = r*sinθ
z = z
r =sqrt(x*x+y*y)
tanθ = y/x
使用两个角度和到原点的距离来定义点,如图:
其中:
r = p*sinφ
x = r*cosθ
y = r*sinθ