(x, y)가 아닌 (x, z)가 사용되는 3D 공간 내에서 입방 형 베 지어 곡선을 따라 이동할 때 접선에 관한 문제가 있습니다. 커브 이미지가 추가되었습니다.C++ 베 지어 곡선 접선 방향 문제
이미지에 표시되는 빨간색 줄을 누르면이 문제가 발생합니다. 접선은 0.0에서 1.0까지 점진적으로 시작하지만 빨간색 선을 치고 1.0에서 0.0으로 점진적으로 감소하기 시작하여 엔터티의 방향이 바뀝니다.
현재이 잘린 접선을 담당 :
const Vector3 Class::getTangent(const float s) const
{
const float t { 1 - s };
return (3 * t * t * (points.at(1) - points.at(0)) +
6 * s * t * (points.at(2) - points.at(1)) +
3 * s * s * (points.at(3) - points.at(2)));
}
는 I는이 기능을 사용
Vector3 firstDerivative = curve.getTangent(segment);
firstDerivative.normalise();
Vector3 normal = firstDerivative.crossProduct(Vector3(0, 0, 1)); // Z = forward
normal.normalise();
Vector3 b = firstDerivative.crossProduct(normal);
b.normalise();
그럼 곡선을 따라 엔티티의 방향을 설정하기위한 간단한 사용 b
. 엔티티를 반전시키는 지점에 도달하면 b
의 부호를 -b
으로 전환하여 간단하거나 더러운 수정을 작성했습니다. 현재이 "고정"에도 불구하고 커브가 변경되면 나중에 문제가 발생할 것이라고 나는 믿습니다.
누구든지 내가 잘못했을 수도 있고 해결해야 할 수도있는 부분을 발견하면 도움이 될 것입니다. 가상 또는 C++ 코드를 통해 주어진 문제와 함께 솔루션의 예를 제공 할 수도 있습니다.
귀하의 질문은 명확하지 않습니다. 정확하고 길이가 0 또는 1보다 훨씬 큰 벡터를 생성합니다. 그 대신에 교차 제품을 왜 사용하고 있습니까? 벡터 교차 제품은 3D에서만 의미가 있습니다. 2d의 경우 점 t에 대한 접선 벡터를 취하여 단위 길이로 정규화 한 다음 90도 회전 할 수 있습니다. 끝난! 정규화 된 접선 벡터가 (vx, vy)이면 법선 벡터는 간단히 (-vy, vx)입니다. http://pomax.github.io/bezierinfo/#pointvectors를 참조하십시오. –
아, 아마도 제가 언급 했어야합니다. 3D 공간에서. y 벡터는 위로, x와 z는 보통 x와 y와 같은 위치 지정에 사용됩니다. 나는 당신이 말했던 것을 이해하고 정규화 된 접선으로 시도했다고 생각합니다 : \t'float fdx = firstDerivative.x * cos (90) - firstDerivative.z * sin (90); \t float fdz = firstDerivative.x * sin (90) + firstDerivative.z * cos (90); \t Vector3 newVec = Vector3 (fdx, 0, fdz); '그러나 이렇게하면 빨간색 선에 다시 도달 한 후 엔터티가 튀어서 같은 결과가 나타납니다. _ 그러나 나는이 경우에 일반을 사용하지 않았습니다 ... _ – SharkBytes