小编Len*_*ite的帖子

在两个四元数之间插值很长

我们可以像这样在两个四元数之间进行 slerp 插值:

quat slerp(quat q1, quat q2, float t) {
    float angle = acos(dotProduct(q1, q2));
    float denom = sin(angle);
    //check if denom is zero
    return (q1*sin((1-t)*angle)+q2*sin(t*angle))/denom;
}
Run Code Online (Sandbox Code Playgroud)

这将以最短的方式在两个四元数之间进行插值。然而,在四元数之间进行插值还有很长的路要走。如下图所示(来源Maya)。

在此处输入图片说明

我们如何插值很长的路?

c c++ interpolation linear-algebra quaternions

7
推荐指数
1
解决办法
595
查看次数

AABB 与胶囊(扫掠球体)之间的交点

A我在 R3 空间中有一个由最小向量和 最大向量定义的轴对齐边界框,以及由具有端点和和半径的B线段定义的胶囊。我想检查这两个形状是否相交。abr

我知道如果胶囊的定义线段与 AABB 相交,这两个形状实际上会相交。然而,我该如何处理剩余的情况,其中线段不与 AABB 相交,但胶囊仍然与 AABB 相交。

geometry intersection computational-geometry

5
推荐指数
1
解决办法
1248
查看次数

在不影响重力的情况下阻尼弹簧

我在 OpenGL 中实现了一个弹簧粒子系统,其中一个粒子 B 被约束到 A,具有给定的偏移距离。粒子 B 受弹簧力和重力的影响。这是实现:

vec3 velocity;
float k = 1.0f;
float damping = 0.1f;
dt = 0.01f;
void ImplementSpring(vec3 &Apos, vec3 &Bpos, float offsetDistance) {
    vec3 dir = Apos-Bpos;
    vec3 normdir = normalize(dir);
    float currentDistance = length(dir);


    //Forces
    vec3 gravity = vec3(0, -1, 0)*dt;
    vec3 spring = normdir*(currentDistance-offsetDistance)*k*dt;
    vec3 dampingForce = velocity*damping;

    //Calculate velocity
    vec3 acceleration = (gravity+spring-dampingForce)/particleMass;
    velocity += acceleration;
    Bpos += velocity;
}

void main() {
    ImplementSpring(vec3(0, 0, 0), vec3(0, -3, 0), 4);
} …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rigid-bodies particle-system glm-math

3
推荐指数
1
解决办法
206
查看次数