2016-08-29 3 views
0

У меня есть шар с центром в (0,0,0) и радиусом = 1, с тремя отмеченными точками на его поверхности, образуя треугольник:вращения Вычислить вектором

x = (1,0,0) 
y = (0,1,0) 
z = (0,0,1) 

В настоящее время, я перевожу у вектором v_y получить у «

v_y = [1, 2, 3] 
y' = (1, 3, 3) 

Я хочу, чтобы вычислить v_x и v_z Кстати, и х» а nd z 'будет двигаться таким же образом, поэтому расчетные точки будут формироваться с одинаковым треугольником (одинаковые соотношения сторон к бокам)

Я знаю, что это может быть достигнуто путем поворота и масштабирования этой сферы, но я не знаю, как вычислить это просто зная этот вектор. Мне нужно два угла для вращения и один скаляр для масштабирования.

Возможно, я ошибаюсь, и я могу просто вычислить эти векторы, не вычисляя поворот.

+0

Что не так с переводом 'x' и' z' с тем же вектором? –

+0

@NicolBolas это просто перевести эти моменты. Я хочу, чтобы они оставались на сфере с центром в (0,0,0) –

+0

Но 'y' больше не в этой сфере. Неясно, где должны быть 'x' и' z'. –

ответ

1

Я думаю, что получаю то, что вы пытаетесь сделать здесь. Вы добавляете v_y к y, чтобы сформировать y ', и вы хотите, чтобы x и z (перпендикулярные векторы) оставались перпендикулярными и относительно увеличивались в длину, чтобы достичь окружности сферы, которая теперь масштабируется.

Я сделаю это в двух частях, масштабирую и поверну. обратите внимание, что y2 в коде - ваш y '. Здесь я использую glm, но вы можете заменить его собственной математической библиотекой.

//compute y2 
glm::vec3 y2 = y + v_y; 

//compute the scale 
float scale = glm::length(y2)/glm::length(y); 

//compute the scaled x and z 
glm::vec3 x2 = x * scale; 
glm::vec3 z2 = z * scale; 

//find the normal and angle and arc as a quaternion 
glm::vec3 ynorm = cross(y, glm::normalize(y2)); 
float angle = glm::angle(y, glm::normalize(y2)); 
glm::quat arcQuat = glm::angleAxis(angle, ynorm); 

//now rotate x2 and z2 with the above arc 
x2 = glm::gtx::quaternion::rotate(arcQuat, x2); 
z2 = glm::gtx::quaternion::rotate(arcQuat, z2); 

//now you have your v_x and v_z 
glm::vec3 v_x = x2 - x; 
glm::vec3 v_z = z2 - z; 

Если масштабировать сферу по шкале, x2, y2, z2 образуют подобный треугольник, который вы хотите.

+0

Спасибо! это именно то, что мне нужно !, сейчас я вижу, что я не был ясен :) –

1

Невозможно узнать, как создать другие вершины, не зная, какое преобразование вы на самом деле используете, и, следовательно, как вы ожидаете, что другие верты будут двигаться.

Основываясь на одной исходной точке и одной новой точке, вы описываете только радиус и одну ось ориентации сферы (вектор между началом координат и y '). Тем не менее, это неоднозначно относительно вращения второй оси, вам нужно конкретно определить точное преобразование. Вы можете вращать новую сферу на 360 градусов вокруг вектора между началом координат и y ', и любое из этих значений на 360-градусной дуге будет описывать допустимые значения x' и z '.

Смежные вопросы