乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 101|回复: 6

旋转一个矢量以匹配另一个矢量的旋转。

[复制链接]

4

主题

54

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2016-3-31 14:49:03 | 显示全部楼层 |阅读模式
我在可视化旋转一个向量以匹配另一个向量时需要做什么时遇到了问题。我相信我需要使用旋转向量来变换实体,但我没有得到正确的参数
因此,我试图改变对象的法线,但有一些问题。我使用固体的TransformBy方法和Matrix3d。旋转(角度、轴、中心)。我的代码看起来像这样
双旋转角=向量3d.ZAxis.GetAngleTo(this.Normal,向量3d.ZAxis.CrossProduct(this.Normal))
partAsSolid.TransformBy(矩阵3d.Rotation(旋转角、向量3d.ZAxis.CrossProduct(this.Normal)、this。位置))
我对旋转角度不确定,对轴也不确定。我知道轴需要是ZAxis(原始向量)和新向量(法线)的叉积。我只是不确定右手法则在叉积的顺序中是否重要。我绕着矢量旋转,所以它的方向无关紧要。(我想)
为了计算旋转角度,我使用了重载方法,该方法获取要获取角度的向量,以及要用于旋转的平面法线。我再次使用叉积来得到两个向量构成的平面的法线
当我创建法线不变(Z轴)的零件,然后法线等于负Z轴时,零件的绘制方式相同
这是我创建实体并进行转换的代码。它是从更大的结构继承的类的一部分。无论何时对对象进行更改,都会从头开始重新绘制
公共重写Solid3d CreateSolid()
{
双convertedWidth=ConvertDimension(此宽度)
双convertedDepth=ConvertDimension(此深度)
双转换厚度=转换尺寸(此厚度)
Solid3d partAsSolid=new Solid3d()
<div>Vector3d矢量=Vector3d.ZAxis。旋转比(度弧度(-90),矢量3d.XAxis)
Point3d:point1=这个。位置+矢量3D.XAxis。否定()*this.Extension1
Point3d:point2=point1+向量*(转换宽度/2.0)
Point3d:point3=point2+矢量。否定()*转换宽度
Point3d:point4=point3+Vector3d.ZAxis。否定()*转换深度
Point3d:point5=point4+vector*convertedThickness
Point3d:point6=point5+Vector3d。ZAxis*(转换深度-转换厚度)
Point3d:point7=point6+向量*(convertedWidth-convertedThickness)
使用(Point3dCollection顶点=新的Point3DCollections())
{
顶点。添加(点2)
顶点。添加(点3)
顶点。添加(点4)
顶点。添加(点5)
顶点。添加(点6)
顶点。添加(点7)
使用(Polyline3d-sweepEntity=新的Polyline3d(Poly3dType.SimplePoly,顶点,true))
{
矢量3D方向矢量=矢量3D。XAxis*(this.Extension1+this.Length+this.Extension2)
partAsSolid。CreateExtrudedSolid(sweepEntity,directionVector,new SweepOptions())
}
}
//使用旋转值作为角度围绕X轴旋转零件。
partAsSolid.TransformBy(矩阵3d.Rotation)(度弧度(此旋转),矢量3d。XAxis,这个位置))
//将原始法线(始终为ZAxis)转换为新法线。
双旋转角=Vector3d.ZAxis.GetAngleTo(this.Normal,Vector3d.ZAxis.CrossProduct(this.Normal))
partAsSolid.TransformBy(矩阵3d.Rotation(rotationAngle,Vector3d.ZAxis.CrossProduct(this.Normal),this.Location))
返回partAsSolid
}
有什么想法吗?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2016-3-31 15:43:28 | 显示全部楼层
对于其他阅读本文的人,我想出了一个解决方案。首先,我认为我的部分问题是,取两个相反向量的叉积得到的向量是0。这是因为它们之间的角度的sin是0。我花了很长时间才记住这一点。其次,我将零件的默认法线更改为X轴,以对应于默认绘制的方向。最后,我将“法线”的名称改为“方向”,以更好地指示正在发生的事情。请参见下面的代码
公共重写Solid3d CreateSolid()
{
双convertedWidth=ConvertDimension(此宽度)
双convertedDepth=ConvertDimension(此深度)
双转换厚度=转换尺寸(此厚度)
Solid3d partAsSolid=new Solid3d()
<div>Vector3d矢量=Vector3d.ZAxis。旋转比(度弧度(-90),矢量3d.XAxis)
Point3d:point1=这个。位置+矢量3D.XAxis。否定()*this.Extension1
Point3d:point2=point1+向量*(转换宽度/2.0)
Point3d:point3=point2+矢量。否定()*转换宽度
Point3d:point4=point3+Vector3d.ZAxis。否定()*转换深度
Point3d:point5=point4+vector*convertedThickness
Point3d:point6=point5+Vector3d。ZAxis*(转换深度-转换厚度)
Point3d:point7=point6+向量*(convertedWidth-convertedThickness)
使用(Point3dCollection顶点=新的Point3DCollections())
{
顶点。添加(点2)
顶点。添加(点3)
顶点。添加(点4)
顶点。添加(点5)
顶点。添加(点6)
顶点。添加(点7)
使用(Polyline3d-sweepEntity=新的Polyline3d(Poly3dType.SimplePoly,顶点,true))
{
矢量3D方向矢量=矢量3D。XAxis*(this.Extension1+this.Length+this.Extension2)
partAsSolid。CreateExtrudedSolid(sweepEntity,directionVector,new SweepOptions())
}
}
//使用旋转值作为角度围绕X轴旋转零件。
partAsSolid.TransformBy(矩阵3d.Rotation)(度弧度(此旋转),矢量3d。XAxis,这个位置))
//将原始方向(始终为X轴)变换为新方向。当
//新的法线是-XAxis。两个相等或相反向量的叉积为0。我们只处理
//相反的情况是,如果它们相等,那么它就不会变换实体并使其保持在原始方向上。
矢量三维轴=此。方向==Vector3d.XAxis。否定()?矢量3D。YAxis:Vector3d.XAxis.CrossProduct(该方向)
double rotationAngle=Vector3d.XAxis.GetAngleTo(此方向,轴)
partAsSolid.TransformBy(矩阵3d.Rotation(旋转角、轴、此位置))
返回partAsSolid
}
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-3-31 16:03:30 | 显示全部楼层
我不知道你在这里到底想做什么。
我看到了围绕x轴的第一次旋转。如果你围绕x轴旋转+Z轴,它永远不会以-X结束。它将是ZY平面中的某个东西。
我不知道你为什么要单独处理法线。你看过第一次旋转后的法线吗?
回复

使用道具 举报

4

主题

54

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2016-3-31 18:49:21 | 显示全部楼层

我基本上是在特定位置创建零件。零件将总是以相同的方向绘制。沿着X轴。然后一旦画出来,我就把它们转换成想要的旋转和方向。最初我试图这样做,因为部分正在绘制,但它导致了一些部分的问题。
当我第一次开始上课时,我试图画出每个部分的最终位置和方向。这导致一些需要多段线才能创建的部分出现了一些问题。所以我转而在静态位置创建零件,然后在完成后旋转和变换零件。你在第9行看到的绕x轴的旋转,实际上只是得到一个Y轴正方向的矢量。这一整行和变量实际上可以用Vector3d代替。这是我已经在最终代码中完成的。最初不是绕X轴旋转Z轴,而是绕X轴旋转法线。一旦零件变成静态,这种情况就会改变,直到它被转换。
**编辑* *您在第32行看到的第一个旋转是围绕X轴旋转的部分。这不同于“旋转”零件以匹配方向向量。
正如我在第二篇帖子中提到的,我不再处理正常情况。我改变了代码,改为使用方向。因此,我试图完成的是,我发布的最终代码能够绘制一个具有旋转、位置和方向的部分。定位点是零件将被插入的位置。旋转控制零件在设置方向之前绕X轴旋转。最后,方向参数会将零件“旋转”到选定的方向向量。
上面代码中的特定部分实际上是一块角铁。它是平边朝上画的。如果我需要底部的平边,我可以设置旋转值。如果我需要它是垂直的而不是水平的,那么我可以将其方向属性设置为(0,0,1)。
我在最初的代码中遇到的真正问题是,我忘记了取两个方向相同或相反的向量的叉积将返回向量0,0,0。一旦我把它算进去,一切都如我所愿。其余的只是绒毛,以使获得正确定位的部分。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-3-31 21:25:02 | 显示全部楼层

这是一个很难发现的陷阱。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2016-3-31 23:54:31 | 显示全部楼层
很好地找到并解决了Keith。感谢您发布思考过程和解决方案。
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2016-4-1 13:39:49 | 显示全部楼层
啊哈。现在更有意义了。谢谢。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 18:46 , Processed in 0.394657 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表