Модератор: Mikle
через вектор нормали первого повернуть второй треугольник
Mikle писал(а):Vovik
Уточни, что значит:через вектор нормали первого повернуть второй треугольник
Если поворачивать треугольник ВОКРУГ вектора нормали второго, то они не станут параллельными никогда.
Или тебе нужно повернуть, ЗНАЯ векторы нормали треугольников?
Такая задача неполная, вычислив угол поворота, мы можем поворачивать второй треугольник вокруг начала координат, вокруг центра тяжести, вокруг любого вертекса (например вокруг общей вершины двух треугольников). Результат будет разным, но в каждом случае треугольники станут параллельными.
Во втором треугольнике знаем только вершины.. через мировую матрицу задаю координаты и поворот... центр тяжести не известен...Mikle писал(а):Vovik
А что мы знаем во втором треугольнике? Только вершины? Или еще центр тяжести?
Когда ты говоришь о нормали к треугольнику, ты имеешь ввиду, что нормали всех трех его вертексов равны, или это усредненное значение, или вертексы вообще без нормалей, а есть геометрически вычисленная нормаль к плоскости треугольника?
Option Explicit
Dim A1 As D3DVECTOR, B1 As D3DVECTOR, C1 As D3DVECTOR, N1 As D3DVECTOR
Dim A2 As D3DVECTOR, B2 As D3DVECTOR, C2 As D3DVECTOR, N2 As D3DVECTOR, P2 As D3DVECTOR
Private Sub Form_Load()
Randomize Timer
A1 = vec3(Rnd, Rnd, Rnd)
B1 = vec3(Rnd, Rnd, Rnd)
C1 = vec3(Rnd, Rnd, Rnd)
A2 = vec3(Rnd, Rnd, Rnd)
B2 = vec3(Rnd, Rnd, Rnd)
C2 = vec3(Rnd, Rnd, Rnd)
Work
End Sub
Private Sub Work()
Dim v1 As D3DVECTOR, v2 As D3DVECTOR, VR As D3DVECTOR
Dim t As Single, A As Single, Q As D3DQUATERNION, Mtrx As D3DMATRIX
'Находим нормаль первого треугольника
D3DXVec3Subtract v1, B1, A1
D3DXVec3Subtract v2, C1, A1
D3DXVec3Cross N1, v1, v2
D3DXVec3Normalize N1, N1
'Находим нормаль второго треугольника
D3DXVec3Subtract v1, B2, A2
D3DXVec3Subtract v2, C2, A2
D3DXVec3Cross N2, v1, v2
D3DXVec3Normalize N2, N2
'Находим центр тяжести второго треугольника
D3DXVec3Add P2, A2, B2
D3DXVec3Add P2, P2, C2
D3DXVec3Scale P2, P2, 1 / 3
'Находим угол поворота
t = D3DXVec3Dot(N1, N2)
If t = 0 Then
A = 1.5707963
Else
A = Atn(Sqr(1 - t * t) / t)
End If
'Находим ось, матрицу и кватернион для поворота
D3DXVec3Cross VR, N1, N2
D3DXQuaternionRotationAxis Q, VR, A
D3DXMatrixAffineTransformation Mtrx, 1, P2, Q, vec3(0, 0, 0)
'Поворачиваем треугольник
D3DXVec3TransformCoord A2, A2, Mtrx
D3DXVec3TransformCoord B2, B2, Mtrx
D3DXVec3TransformCoord C2, C2, Mtrx
End Sub
Private Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR
vec3.x = x
vec3.y = y
vec3.z = z
End Function
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6