如何在 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。方法如下:

  1. v1为0,r,0(r为圆柱体的高度)
  2. v2 是您希望顶部中心所在的坐标
  3. 向量 a = 叉积(v1,v2)
  4. 归一化向量a。 VRML规范。说它需要一个归一化的旋转向量,所以安全总比后悔好。要归一化,请计算向量 a 的长度,然后将 x、y 和 z 分量除以长度。
  5. 旋转角度为length(v1) * length(v2) + dotproduct(v1,v2)
  6. 所以您只需要一个旋转变换,其中您使用 x、y 和 z 值作为在步骤 4 中计算的 归一化 向量和在步骤 1 中计算的角度5.