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

Create Vector B Using Position and Direction of Vector A

我目前正在尝试了解如何在相对于另一个向量的位置和方向的特定位置创建一个向量。例如,我有这张插图可能有助于解释我想要完成的事情:

A 包含属性:glm::vec3 positionglm::vec3 direction。现在假设我希望点 BA 前面 2 个单位。有没有一种方法可以使用 glm 确定 B?

的位置来数学解决这个问题

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

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

射线上的一个点可以通过:

B = A + D * t

其中 A 是射线的原点,D 是长度为 1 (Unit vector) 的方向向量,t 是距离形式 AB

有了GLM这可以这样表达:

struct Ray
{
    glm::vec3 position;
    glm::vec3 direction;
};

Ray A;
float t = 2.0f;
glm::vec3 B = A.position + glm::normalize(A.direction) * t;

normalize() 计算与给定向量方向相同但长度为 1 的向量。

如果方向向量存储为单位向量(长度为 1),则在计算射线上的点时可以避免昂贵的 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(....));
glm::vec3 B = A.P( 2.0f );