Math 如何在VRML中的原点和某些坐标之间创建圆柱体

Math 如何在VRML中的原点和某些坐标之间创建圆柱体,math,3d,vrml,Math,3d,Vrml,我正在以编程方式在VRML2.0中创建一些文件。我需要构造一个圆柱体,它的底部在原点,顶部在给定的坐标,但是我在计算旋转时遇到了一些问题。我在谷歌上搜索过,但是VRML2.0上的文档似乎非常稀少 我假设这对我要做的事情最有效,所以我计算了目标点(x,y,z)的球坐标(r,θ,φ)。然后我创建了下面的文件 #VRML V2.0 utf8 DEF v1 Transform { translation 0 0 0 children Shape { geometry S

我正在以编程方式在VRML2.0中创建一些文件。我需要构造一个圆柱体,它的底部在原点,顶部在给定的坐标,但是我在计算旋转时遇到了一些问题。我在谷歌上搜索过,但是VRML2.0上的文档似乎非常稀少

我假设这对我要做的事情最有效,所以我计算了目标点(x,y,z)的球坐标(r,θ,φ)。然后我创建了下面的文件

#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
                    }
                }
            }
        }
    }
}

如果您查看最后一个文件,您将看到圆柱体实际上非常接近,但还不太接近。

好的,我做这件事已经很久了,但我想我已经知道了为什么您的方法不起作用以及如何做到这一点。正如您所尝试的,使用球坐标计算是从一个自身不旋转的固定参照系开始的。但一旦在VRML中的代码中围绕y旋转,z轴就不再指向它原来所在的位置,而是也旋转了。你的参照系改变了

现在,一种方法是使用Euler角度和多个x、y和z旋转,但在计算出旋转角度(表示旋转向量的x、y和z坐标以及旋转量)后,应该能够进行单个旋转。查看公式的来源

方法: 您希望圆柱体坐标系中重新定向的y轴与从原点到给定坐标的向量对齐,因此您希望通过旋转将点0、r、0移动到新指定的x、y、z。以下是如何做到这一点:

  • v1为0,r,0(r为气缸高度)
  • v2是希望顶部中心所在的坐标
  • 向量a=叉积(v1,v2)
  • 规范化向量a。VRML规范说它需要一个标准化的旋转向量,所以最好是安全的。要进行规格化,请计算向量a的长度,然后将x、y和z分量除以长度
  • 旋转角度为长度(v1)*长度(v2)+点积(v1,v2)
  • 因此,您只需要一个旋转变换,其中使用第4步中计算的归一化向量a的x、y和z值以及第5步中计算的角度
    默认情况下,圆柱体节点不是以原点为中心吗?如果希望基础位于原点,则需要将其平移高度的1/2。此外,圆柱体的高度是根据希望顶部的位置计算的,顶部的点是顶部的中间点吗?有一些很好的参考,圆柱体确实是以原点为中心的,但我已经翻译过了,所以这不是问题所在。平移是边定义的第七行。顶部的点实际上是中间。我知道第一个参考,但它是非常模糊的具体轮换。第二个参考对我来说是新的,我会看一看。