Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opengl 3D转换需要旋转矩阵吗_C++_Opengl_Graphics_3d_Transformation - Fatal编程技术网

C++ opengl 3D转换需要旋转矩阵吗

C++ opengl 3D转换需要旋转矩阵吗,c++,opengl,graphics,3d,transformation,C++,Opengl,Graphics,3d,Transformation,问题是我在3D空间中有两个点,y+向上,x+向右,z+朝向你。我想在它们之间确定一个圆柱体的方向,这是两个点之间距离的长度,这样它的两个中心端都接触到这两个点。我让圆柱体平移到两点中心的位置,我需要得到一个旋转矩阵的帮助来应用到圆柱体上,以便它以正确的方式定位。我的整个变换矩阵如下所示: 平移(中心点)*旋转(某些X度)*旋转(某些Z度) 翻译是最后应用的,这样我可以在翻译之前把它弄到正确的方向 以下是迄今为止我对此的看法: mat4 getTransformation(vec3 point,

问题是我在3D空间中有两个点,y+向上,x+向右,z+朝向你。我想在它们之间确定一个圆柱体的方向,这是两个点之间距离的长度,这样它的两个中心端都接触到这两个点。我让圆柱体平移到两点中心的位置,我需要得到一个旋转矩阵的帮助来应用到圆柱体上,以便它以正确的方式定位。我的整个变换矩阵如下所示:

平移(中心点)*旋转(某些X度)*旋转(某些Z度)

翻译是最后应用的,这样我可以在翻译之前把它弄到正确的方向

以下是迄今为止我对此的看法:

mat4 getTransformation(vec3 point, vec3 parent)
{
    float deltaX = point.x - parent.x;
    float deltaY = point.y - parent.y;
    float deltaZ = point.z - parent.z;

    float yRotation = atan2f(deltaZ, deltaX) * (180.0 / M_PI);
    float xRotation = atan2f(deltaZ, deltaY) * (180.0 / M_PI);
    float zRotation = atan2f(deltaX, deltaY) * (-180.0 / M_PI);
    if(point.y < parent.y)
    {
        zRotation = atan2f(deltaX, deltaY) * (180.0 / M_PI);
    }

    vec3 center = vec3((point.x + parent.x)/2.0, (point.y + parent.y)/2.0, (point.z + parent.z)/2.0);
    mat4 translation = Translate(center);
    return translation * RotateX(xRotation) * RotateZ(zRotation) * Scale(radius, 1, radius) * Scale(0.1, 0.1, 0.1);
}
运行上述代码后,我得到以下结果:

每个黑点都是一个点,其父点是生成它的点(在它之前的一个),我希望分支适合这些点。基本上,我正在尝试实现用于随机树生成的空间定植算法。我得到了它的大部分,但我想把分支映射到它,这样看起来就很好了。我可以使用GL_线只是为了建立一个通用的连接,但是如果我让它工作起来,它会看起来更漂亮。对算法进行了说明

这是我正在尝试做的一个图像(请原谅我的绘画技巧)


好吧,有任意数量的旋转矩阵满足您的约束。但任何一个都可以。我们不需要计算具体的旋转,而是直接写下矩阵。假设未应用任何变换时,圆柱体的轴沿Z轴。因此,必须将局部空间Z轴朝着这两点之间的方向变换。即
z_t=normalize(p_1-p_2)
,其中
normalize(a)=a/长度(a)

现在我们只需要把它做成一个完整的三维坐标系。我们从一个与z_t不平行的任意向量开始。例如,(1,0,0)或(0,1,0)或(0,0,1)中的一个;将标量积
·
(也称为内积或点积)与z_t一起使用,并使用绝对值最小的向量,我们将此向量称为
u
。 在伪代码中:

# Start with (1,0,0)
mindotabs = abs( z_t · (1,0,0) )
minvec = (1,0,0)
for u_ in (0,1,0), (0,0,1):
    dotabs = z_t · u_
    if dotabs < mindotabs:
        mindotabs = dotabs
        minvec = u_

u = minvec_
#从(1,0,0)开始
mindotabs=abs(z_t·(1,0,0))
minvec=(1,0,0)
对于u_uin(0,1,0),(0,0,1):
dotabs=z_t·u_
如果dotabs
然后将该向量正交化,产生局部y变换
y\u t=normalize(u-z\u t·u)

最后,通过取叉积
x_t=z_t×y_t

要将圆柱体移动到位,请将其与匹配的平移矩阵相结合

变换矩阵实际上就是你“来自”的空间的轴,就像从另一个空间看到的一样。所以得到的矩阵,就是你要找的旋转矩阵,就是向量x,y,z,并排的矩阵。OpenGL使用所谓的同伦矩阵,因此您必须使用0,0,0,1最底部的行和最右侧的列将其填充为4×4的形式


然后可以加载到OpenGL中;如果使用固定函数使用glMultMatrix应用旋转,或者使用着色器在矩阵上乘法,最终将传递到glUniform。

从一个单位长度的圆柱体开始,该圆柱体的一端位于原点,我称之为
C1
(请注意,您的图像表明圆柱体的中心位于原点,但您可以轻松地将其转换为我开始的位置)。另一端(我称之为
C2
)位于
(0,1,0)

我想调用世界坐标中的两点
P1
P2
,我们想在
P1
C2
上定位
C1

首先通过
P1
转换气缸,成功地将
C1
定位到
P1

然后按距离(P1,P2)
缩放圆柱体,因为它最初具有长度
1

剩余的旋转可以使用球坐标计算。如果您不熟悉这种类型的坐标系:它类似于GPS坐标:两个角度;一个围绕极轴(在您的例子中是世界的Y轴),我们通常称之为偏航,另一个是俯仰角(在您的例子中是模型空间中的X轴)。这两个角度可以通过将
P2-P1
(即
P2
相对于
P1
的局部偏移)转换为球坐标来计算。首先以俯仰角围绕X旋转对象,然后以偏航角围绕Y旋转对象

这样做就可以了(伪代码):


将圆柱体的轴称为A。第二次旋转(约X)无法改变AX之间的角度,因此我们必须在第一次旋转(约Z)时获得正确的角度

调用目标向量(两点之间的向量)B.Take-acos(BX/BY),这就是第一次旋转的角度


再次取B,忽略X分量,查看其在(Y,Z)平面上的投影。取acos(BZ/BY),这是第二次旋转的角度。

请注意,缺少一个自由度:圆柱体绕其自身轴的滚动。看到你的抽象公式,我想你不在乎这是哪个角度。(这很好,我只是想告诉你在两点之间定向圆柱体还有其他的可能性。)你能给我一些关于其他可能性的提示吗?我从上午11点开始就一直在尝试正确地定向,我只是说你最初的目标描述留下了无限多的解决方案(在数学意义上,不是如何编程)你的想法可能是
# Start with (1,0,0)
mindotabs = abs( z_t · (1,0,0) )
minvec = (1,0,0)
for u_ in (0,1,0), (0,0,1):
    dotabs = z_t · u_
    if dotabs < mindotabs:
        mindotabs = dotabs
        minvec = u_

u = minvec_
Matrix getTransformation(Point P1, Point P2) {
    float length = distance(P1, P2);
    Point direction = normalize(P2 - P1);
    float pitch = acos(direction.y);
    float yaw = atan2(direction.z, direction.x);

    return translate(P1) * scaleY(length) * rotateX(pitch) * rotateY(yaw);
}