如何在 VRML 中的原点和某些坐标之间创建圆柱体
How to create a cylinder between origin and some coordinates in VRML
我正在以编程方式在 VRML 2.0 中创建一些文件。我需要构建一个底部位于原点、顶部位于给定坐标的圆柱体,但我在计算旋转时遇到了一些问题。我用谷歌搜索了一下,但是关于 VRML 2.0 的文档似乎非常稀少。
我假设 spherical coordinates 最适合我正在尝试做的事情,所以我计算了目标点 (x,y,z) 的球坐标 (r, theta, phi)。然后我创建了下面的文件。
#VRML V2.0 utf8
DEF v1 Transform {
translation 0 0 0
children Shape {
geometry Sphere {radius .5}
}
}
DEF v2 Transform {
translation x y z
children Shape {
geometry Sphere {radius .5}
}
}
DEF edge Transform {
translation 0 0 0
children Transform {
rotation 0 1 0 theta-pi/2
children Transform {
rotation 0 0 1 phi-pi/2
children Transform {
translation 0 r/2 0
children Shape {
geometry Cylinder {
radius .08
height r
}
}
}
}
}
}
这是一个包含一些示例值的版本:
#VRML V2.0 utf8
DEF v1 Transform {
translation 0 0 0
children Shape {
geometry Sphere {radius .5}
}
}
DEF v2 Transform {
translation 4 3 3
children Shape {
geometry Sphere {radius .5}
}
}
DEF edge Transform {
translation 0 0 0
children Transform {
rotation 0 1 0 -0.54041949679
children Transform {
rotation 0 0 1 -0.92729521779
children Transform {
translation 0 2.915475947 0
children Shape {
geometry Cylinder {
radius .08
height 5.830951895
}
}
}
}
}
}
如果您查看最后一个文件,您会发现圆柱体实际上已经很近了,但还没有完全到位。
O.K.,我已经很久没有做这些事情了,但我想我已经知道为什么你的方法不起作用以及如何去做。正如您所尝试的那样,使用球坐标进行计算来自本身不旋转的 FIXED 参考系。但是一旦您在 VRML 的代码中绕 y 旋转,z 轴就不再指向它原来的位置,而是也旋转了。你的参考框架改变了。
现在一种方法是使用欧拉角和多个 x、y 和 z 旋转,但是一旦您弄清楚 quaternion (which represents the x, y, and z coordinates of a rotation vector and the amount of rotation). See this Q&A 公式的来源,您就应该能够进行一次旋转。
方法:
您希望圆柱体坐标系中重新定向的 y 轴与从原点到给定坐标的向量对齐,因此您希望通过旋转将点 0、r、0 移动到新指定的 x、y、z。方法如下:
- v1为0,r,0(r为圆柱体的高度)
- v2 是您希望顶部中心所在的坐标
- 向量 a = 叉积(v1,v2)
- 归一化向量a。 VRML规范。说它需要一个归一化的旋转向量,所以安全总比后悔好。要归一化,请计算向量 a 的长度,然后将 x、y 和 z 分量除以长度。
- 旋转角度为length(v1) * length(v2) + dotproduct(v1,v2)
- 所以您只需要一个旋转变换,其中您使用 x、y 和 z 值作为在步骤 4 中计算的 归一化 向量和在步骤 1 中计算的角度5.
我正在以编程方式在 VRML 2.0 中创建一些文件。我需要构建一个底部位于原点、顶部位于给定坐标的圆柱体,但我在计算旋转时遇到了一些问题。我用谷歌搜索了一下,但是关于 VRML 2.0 的文档似乎非常稀少。
我假设 spherical coordinates 最适合我正在尝试做的事情,所以我计算了目标点 (x,y,z) 的球坐标 (r, theta, phi)。然后我创建了下面的文件。
#VRML V2.0 utf8
DEF v1 Transform {
translation 0 0 0
children Shape {
geometry Sphere {radius .5}
}
}
DEF v2 Transform {
translation x y z
children Shape {
geometry Sphere {radius .5}
}
}
DEF edge Transform {
translation 0 0 0
children Transform {
rotation 0 1 0 theta-pi/2
children Transform {
rotation 0 0 1 phi-pi/2
children Transform {
translation 0 r/2 0
children Shape {
geometry Cylinder {
radius .08
height r
}
}
}
}
}
}
这是一个包含一些示例值的版本:
#VRML V2.0 utf8
DEF v1 Transform {
translation 0 0 0
children Shape {
geometry Sphere {radius .5}
}
}
DEF v2 Transform {
translation 4 3 3
children Shape {
geometry Sphere {radius .5}
}
}
DEF edge Transform {
translation 0 0 0
children Transform {
rotation 0 1 0 -0.54041949679
children Transform {
rotation 0 0 1 -0.92729521779
children Transform {
translation 0 2.915475947 0
children Shape {
geometry Cylinder {
radius .08
height 5.830951895
}
}
}
}
}
}
如果您查看最后一个文件,您会发现圆柱体实际上已经很近了,但还没有完全到位。
O.K.,我已经很久没有做这些事情了,但我想我已经知道为什么你的方法不起作用以及如何去做。正如您所尝试的那样,使用球坐标进行计算来自本身不旋转的 FIXED 参考系。但是一旦您在 VRML 的代码中绕 y 旋转,z 轴就不再指向它原来的位置,而是也旋转了。你的参考框架改变了。
现在一种方法是使用欧拉角和多个 x、y 和 z 旋转,但是一旦您弄清楚 quaternion (which represents the x, y, and z coordinates of a rotation vector and the amount of rotation). See this Q&A 公式的来源,您就应该能够进行一次旋转。
方法: 您希望圆柱体坐标系中重新定向的 y 轴与从原点到给定坐标的向量对齐,因此您希望通过旋转将点 0、r、0 移动到新指定的 x、y、z。方法如下:
- v1为0,r,0(r为圆柱体的高度)
- v2 是您希望顶部中心所在的坐标
- 向量 a = 叉积(v1,v2)
- 归一化向量a。 VRML规范。说它需要一个归一化的旋转向量,所以安全总比后悔好。要归一化,请计算向量 a 的长度,然后将 x、y 和 z 分量除以长度。
- 旋转角度为length(v1) * length(v2) + dotproduct(v1,v2)
- 所以您只需要一个旋转变换,其中您使用 x、y 和 z 值作为在步骤 4 中计算的 归一化 向量和在步骤 1 中计算的角度5.