2013-11-13 1 views
0

Я пытаюсь переместить объект из точки a в точку b в дуговом движении в трехмерном пространстве. Я недавно читал на матрицах, и я пытаюсь обойти их, но безрезультатно. Скажем:Движение половины круга между двумя матрицами

a = (x.100.0,y.200.0,z.300.0) 
b = (x.-300.0,y.-100.0,z.0.0) 
c = finding the middle of a,b matrices 
d = start at a, do something with math.pi and multiplying the c matrices to give you and arc motion over to b. 

Затем вычислить положение дуги с с находящимся в середине дуги. Правильно ли это?

+1

Посмотрите http://en.wikipedia.org/wiki/Slerp я не уверен, что это именно то, что вы хотите, но оно точно сопоставилось с тем, как я проанализировал ваш вопрос. Если это нормально, я тоже отвечу. –

+0

Существует бесконечное число дуг между двумя точками в 3D-пространстве. Какой вы хотите? – justhalf

+0

Спасибо, я посмотрю на эту ссылку. И justhalf, это хороший момент, я не уверен, как это сказать, но это два векторных вектора поворота «вверх», давайте скажем, что он будет двигаться и х, у дуга. Подобно тому, как это было 2d, я супруг. Думаю, с добавленным размером 3d, позиция a будет указывать на позицию b и дуги вдоль «вверх» вектора обеих точек. Я надеюсь, что в этом есть смысл. На этом этапе любая дуга будет делать, если честно, просто изо всех сил пытаюсь ее решить. – justachap

ответ

1

Позвольте u и v быть вашим двумя векторами. Нормализовать два вектора для получения u' и v', соответственно. Вычислите перекрестное произведение u' и v', чтобы получить вектор w, ортогональный им обоим. Нормализовать w для получения w'.

Теперь вы хотите создать поворот R о оси w' такой, что R * u' = v'. Пока u и v не являются коллинеарными, есть только два варианта, соответствующие по часовой стрелке и против часовой стрелки. Один из них будет короче, что соответствует оптимальному вращению.

Этот раздел Википедии описывает, как построить R: http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle

У вас есть ось w', и угол arccos(dot(u', v')), поскольку скалярное произведение единичных векторов на косинус угла между ними.

+0

Вы можете знать это, так что это в основном для пользы OP: это повернет один вектор в другой, но в целом ориентация описывается вектором _and_ и углом (или кватернионом). Если вы начинаете с вращения _matrices_, этот ответ будет только наполовину полным, если вы хотите повернуть один вектор в другой или у вас осевая симметрия, это прекрасно. – Hooked

+0

@ Заранее спасибо за это. Теперь имеет смысл, что вы указали это. На этом этапе я просто буду рад получить что-то работающее, но мне понадобится решение проблемы, о которой вы упомянули, когда у меня не будет осевой симметрии в какой-то точке. – justachap

+0

@ Timothy-Shields Спасибо за помощь, это звучит многообещающе, изначально я думал, что мне, возможно, придется нормализовать векторы, но не уверен. Как «создать поворот R вокруг оси w» так, что R * u '= v' "? – justachap

0

Центр вашего круга M = (a + b)/2, его радиус r = | a-b |/2. Вы обнаружите, что точка с, когда вы идете из М в направлении, перпендикулярном (б-а):

c = M + r * v/abs(v) 

с V быть любой вектор, перпендикулярный (Ь-а). Одним из способов найти такой перпендикулярный вектор v является взятие поперечного произведения (b-a) с любым произвольным вектором, который не параллелен (b-a), например.

v = (b-a) <crossproduct> (x.0, y.0, z.1) 

Как уже упоминалось ранее Есть много решений этой проблемы, в зависимости от ст.