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++ 使用向量A的位置和方向创建向量B_C++_Opengl_Glm Math - Fatal编程技术网

C++ 使用向量A的位置和方向创建向量B

C++ 使用向量A的位置和方向创建向量B,c++,opengl,glm-math,C++,Opengl,Glm Math,我目前正在尝试理解如何在相对于另一个向量的位置和方向的特定位置创建向量。例如,我有这样一个例子,它可能有助于解释我试图实现的目标: 点A包含属性:glm::vec3位置和glm::vec3方向。现在让我们假设点B在A前面2个单位。有没有办法用glm从数学上解决这个问题来确定B的位置?点B的位置等于点a的位置+点a的方向乘以2,因为(我在这里假设)方向是长度为1的单位向量 glm::vec3 positionB = a.pos + a.dir * 2.f; 点B的位置等于点A的位置+点A的方向

我目前正在尝试理解如何在相对于另一个向量的位置和方向的特定位置创建向量。例如,我有这样一个例子,它可能有助于解释我试图实现的目标:


A
包含属性:
glm::vec3位置
glm::vec3方向
。现在让我们假设点
B
A
前面2个单位。有没有办法用glm从数学上解决这个问题来确定
B
的位置?

点B的位置等于点a的位置+点a的方向乘以2,因为(我在这里假设)方向是长度为1的单位向量

glm::vec3 positionB = a.pos + a.dir * 2.f;

点B的位置等于点A的位置+点A的方向乘以2,因为(我在这里假设)方向是长度为1的单位向量

glm::vec3 positionB = a.pos + a.dir * 2.f;

光线上的点可以通过以下方式获得:

B = A + D * t
其中,
A
是射线的原点,
D
是长度为1()的方向向量,
t
是距离形式
A
B

有了它,可以这样表示:

struct-Ray
{
glm::vec3位置;
glm::vec3方向;
};
射线A;
float t=2.0f;
glm::vec3 B=A.位置+glm::规格化(A.方向)*t;
计算与给定向量方向相同但长度为1的向量

如果方向向量存储为单位向量(长度为1),则在计算光线上的点时,可以避免昂贵的
normalize()
操作。
我建议定义一个
类光线
,它可以计算光线上的一个点:

类射线
{
公众:
射线(常数glm::vec3&O,常数glm::vec3&D)
:_O(O)
,_D(glm::normalize(D))
{}
glm::vec3 P(浮点t)常量{
返回_O+_D*t;
}
私人:
glm::vec3_O;
glm::vec3\u D;
};
射线A(glm::vec3(..),glm::vec3(..);
glm::vec3b=A.P(2.0f);

光线上的点可以通过以下方式获得:

B = A + D * t
其中,
A
是射线的原点,
D
是长度为1()的方向向量,
t
是距离形式
A
B

有了它,可以这样表示:

struct-Ray
{
glm::vec3位置;
glm::vec3方向;
};
射线A;
float t=2.0f;
glm::vec3 B=A.位置+glm::规格化(A.方向)*t;
计算与给定向量方向相同但长度为1的向量

如果方向向量存储为单位向量(长度为1),则在计算光线上的点时,可以避免昂贵的
normalize()
操作。
我建议定义一个
类光线
,它可以计算光线上的一个点:

类射线
{
公众:
射线(常数glm::vec3&O,常数glm::vec3&D)
:_O(O)
,_D(glm::normalize(D))
{}
glm::vec3 P(浮点t)常量{
返回_O+_D*t;
}
私人:
glm::vec3_O;
glm::vec3\u D;
};
射线A(glm::vec3(..),glm::vec3(..);
glm::vec3b=A.P(2.0f);

本例中的“前面”是什么?本例中的“前面”是什么?否!您忘了规范化
a.dir
。如果你不规范化它,那么它将是A前面的2个dir长度,而不是A前面的两个单位。@mackycheese21你不认为一个名为
方向的字段已经规范化了吗?不一定,不。方向可能意味着从速度到实际方向的任何东西。归一化是一个简单的操作,它给了你一个重要的保证,它是值得的。我知道它有一个慢的平方根,但是考虑一下:如果平方根的速度减慢你的计算机,要么你滥用GLM,要么应该使用GPU/GLSL/OpenCL,“或者你在吃土豆,没有人能帮你。”@mackycheese21我觉得你最后的说法有点可笑。任何优化CPU代码的尝试都是徒劳的,只需使用GPU即可?不!您忘了规范化
a.dir
。如果你不规范化它,那么它将是A前面的2个dir长度,而不是A前面的两个单位。@mackycheese21你不认为一个名为
方向的字段已经规范化了吗?不一定,不。方向可能意味着从速度到实际方向的任何东西。归一化是一个简单的操作,它给了你一个重要的保证,它是值得的。我知道它有一个慢的平方根,但是考虑一下:如果平方根的速度减慢你的计算机,要么你滥用GLM,要么应该使用GPU/GLSL/OpenCL,“或者你在吃土豆,没有人能帮你。”@mackycheese21我觉得你最后的说法有点可笑。任何优化CPU代码的尝试都是徒劳的,只需使用GPU就可以了?