2009-06-03 3 views
0

Point3.Slerp 메서드를 구현하려고하지만 일부 샘플을 찾고 있지만 찾은 코드는 모든 코드를 호스팅하는 완전히 새로운 클래스입니다.Point3 용 Slerp 구현 방법은 무엇입니까?

구현하는 간단하고 간단한 방법이 있습니까? 기본적으로 내가 본 매트릭스 유형을 사용했다. 행렬없이 Slerp를 구현할 수 있습니까, 아니면 단점 (성능 등)이 있습니까?

가짜 코드도 좋습니다.

답변

3

일반적으로 포인트가 아닌 쿼터니언과 함께 사용됩니다. 두 개의 특정 회전 사이를 보간하려고 할 때만 의미가 있습니다.

내가 Point3과 직접 관련이 있다는 것을 알 수있는 유일한 곳은 구의 표면에 2 점이 있고 측지선 경로 주변에서 그들을 "slerp"하고 싶을 때뿐입니다. 이 경우, 여러분의 포인트는 실제로 보간되는 포인트가 아닙니다. 두 개의 축과 각도 (쿼터니언을 정의 함)를 계산하고 그 사이를 보간하는 데 사용됩니다.

두 개의 point3 값 사이를 보간하는 경우 직접 선형 보간이 필요할 수 있습니다.

매트릭스 사용 - 쿼터니언 형식으로 포인트를 얻은 경우 quaternion math directly을 사용할 수 있습니다. 매트릭스가 필요하지 않습니다.

1

당신은 쿼터니언이 필요합니다. 그래서 완전히 새로운 클래스가 있습니다.

2

구형 공간 (예 : 행성 표면 또는 이와 유사한 공간)으로 작업하는 경우 점 slerp는 의미가 있습니다.

내 머리 꼭대기에서 시작점과 끝점 (벡터로)의 교차 제품을 사용하여 회전 축을 얻은 다음 X, Y 및 Z에 대한 회전을 계산할 수 있습니다. 자신 만의 행렬 클래스를 만들 수 있습니다.

http://en.wikipedia.org/wiki/Rotation_matrix#Dimension_three

링크는 축/각 쌍의 회전 행렬을 나타낸다. 각 구성 요소에 대한 곱셈을 쓰고 매트릭스가없는 tranformation을 얻는 것을 단순화하십시오.

편집 : Heres는

축 (X, Y, Z)에 대한 간단한 분해 회전 : 당신은뿐만 아니라 매개 변수화 된 회전을 원하기 때문에

X' = (x^2 + (1 - x^2) * cos(theta) + (x * y * (1 - cos(theta)) - x * sin(theta)) + (x * z * (1 - cos(theta)) + y * sin(theta)) 
Y' = (x * y * (1 - cos(theta)) + z * sin(theta)) + (y^2 + (1 - y^2) * cos(theta)) + (y * z * (1 - cos(theta)) - x * sin(theta)) 
Z' = (x * z * (1 - cos(theta)) - y * sin(theta)) + (y * z * (1 - cos(theta)) + x * sin(theta)) + (z^2 + (1 - z^2) * cos(theta)) 

것은, 당신이 당신의 사이의 각도를 계산해야합니다 벡터 (두 점의 스칼라 곱의 역 코사인)를 계산하고 보간 파라미터를 기반으로 0과 그 각도 사이의 값으로 세타를 설정합니다.