Вектор нормали к плоскости и ее поворот

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Вектор нормали к плоскости и ее поворот

Сообщение Vovik » 02.06.2006 (Пт) 20:03

Столкнулся вот с такой задачкой и не могу ее решить... :oops: У меня есть вектор нормали к треугольнику и второй произвольный треугольник. Мне нужно через вектор нормали первого повернуть второй треугольник, чтобы они стали параллельными... никак не могу получить углы поворота... :roll:

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 02.06.2006 (Пт) 21:29

Вот, что-то подобное, только без поворотов, http://bbs.vbstreets.ru/viewtopic.php?t ... highlight=

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 03.06.2006 (Сб) 9:49

Vovik
Уточни, что значит:
через вектор нормали первого повернуть второй треугольник

Если поворачивать треугольник ВОКРУГ вектора нормали второго, то они не станут параллельными никогда.
Или тебе нужно повернуть, ЗНАЯ векторы нормали треугольников?
Такая задача неполная, вычислив угол поворота, мы можем поворачивать второй треугольник вокруг начала координат, вокруг центра тяжести, вокруг любого вертекса (например вокруг общей вершины двух треугольников). Результат будет разным, но в каждом случае треугольники станут параллельными.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 03.06.2006 (Сб) 12:16

Mikle писал(а):Vovik
Уточни, что значит:
через вектор нормали первого повернуть второй треугольник

Если поворачивать треугольник ВОКРУГ вектора нормали второго, то они не станут параллельными никогда.
Или тебе нужно повернуть, ЗНАЯ векторы нормали треугольников?
Такая задача неполная, вычислив угол поворота, мы можем поворачивать второй треугольник вокруг начала координат, вокруг центра тяжести, вокруг любого вертекса (например вокруг общей вершины двух треугольников). Результат будет разным, но в каждом случае треугольники станут параллельными.

Нормаль второго треугольника мы не знаем... Он вращается вокруг центра тяжести... ммм.. короче, нужно чтоб их нормали стали параллельными (но нормаль второго мы не знаем, а вычислять трудоемко... ).

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.06.2006 (Вс) 13:48

Vovik
А что мы знаем во втором треугольнике? Только вершины? Или еще центр тяжести?
Когда ты говоришь о нормали к треугольнику, ты имеешь ввиду, что нормали всех трех его вертексов равны, или это усредненное значение, или вертексы вообще без нормалей, а есть геометрически вычисленная нормаль к плоскости треугольника?

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 04.06.2006 (Вс) 15:49

Mikle писал(а):Vovik
А что мы знаем во втором треугольнике? Только вершины? Или еще центр тяжести?
Когда ты говоришь о нормали к треугольнику, ты имеешь ввиду, что нормали всех трех его вертексов равны, или это усредненное значение, или вертексы вообще без нормалей, а есть геометрически вычисленная нормаль к плоскости треугольника?
Во втором треугольнике знаем только вершины.. через мировую матрицу задаю координаты и поворот... центр тяжести не известен...
Для первого считаю нормаль по трем вершинам... :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.06.2006 (Пн) 13:23

Код: Выделить всё
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

    TopList  
cron