我目前正在尝试了解如何在相对于另一个矢量的位置和方向的特定位置创建矢量。例如,我有此插图,它可能有助于解释我要完成的工作:
点A
包含属性:glm::vec3 position
和glm::vec3 direction
。现在,让我说点B
要在A
前面2个单位。是否可以使用glm确定B
的位置来数学解决此问题?
答案 0 :(得分:2)
射线点可以通过以下方式获得:
B = A + D * t
其中A
是射线的原点,D
是长度为1(Unit vector
)的方向向量,t
是距离形式{{1} }至A
。
使用GLM可以这样表示:
B
struct Ray
{
glm::vec3 position;
glm::vec3 direction;
};
Ray A;
normalize()
按照与给定向量相同的方向计算向量,但长度为1。
如果将方向向量存储为单位向量(长度为1),则在计算射线上的点时可以避免进行昂贵的float t = 2.0f;
glm::vec3 B = A.position + glm::normalize(A.direction) * t;
操作。
我建议定义一个normalize()
来计算光线点:
class Ray
class Ray
{
public:
Ray(const glm::vec3 &O, const glm::vec3 &D)
: _O(O)
, _D(glm::normalize(D))
{}
glm::vec3 P(float t) const {
return _O + _D * t;
}
private:
glm::vec3 _O;
glm::vec3 _D;
};
Ray A(glm::vec3(....), glm::vec3(....));
答案 1 :(得分:0)
点B的位置等于点A的位置+点A的方向乘以2,因为(我在这里假设)方向是长度为1的单位矢量。
glm::vec3 positionB = a.pos + a.dir * 2.f;