Suslik
> Переходишь в двумерную систему координат
Я примерно это и пытался реализовать. Как надо правильно перейти в двумерную систему координат и переместить туда векторы.
kroonk
Переходить в 2д ненадо. Suslik все толково написал. Единственное что, учитываешь пенпердикулярность векторов, тогда поворот двух вокруг третьего сильно упрощается, а именно:
w=v1*cos(fi)-v2*sin( fi) v2=v1*sin( fi)+v2*cos( fi) v1=w
здесь v1,v2-искомые два вектора,w-вспом.вектор
Еще один момент - после N операций вектора станут несовсем единичными и перпендикулярными изза погрешности арифметики, нужна процедура их нормализации:
v1=v1*(1./length( v1)) // приводим v1 к длине 1 v2=v2-v1*dot( v2,v1); // вычитаем из v2 его проекцию на v1 // dot-скалярное произведение, 6й или 7й класс школы вроде v2=v2*( 1./length( v2)) // приводим v2 к длине 1 v3=v3-v1*dot( v3,v1)-v2*dot( v3,v2); // вычитаем из v3 его проекции на v1 и v2 v3=v3*( 1./length( v3)) // приводим v3 к длине 1 // быстрее v3 посчитать как векторное произведение v1 и v2, но его в школе не проходят
И, да, "PhisicModel" - глаза режет, лучше называй грамотно по русски чем так
что-то я вообще запутался, вот у меня изначально 3 вектора X(1,0,0), Y(0,1,0), Z(0,0,1) вот я хочу повернуть X и Z вокруг Y на 90 градусов:
fi = 90.0f * 2 * 3.14f / 360; w=X*cos(fi)-Z*sin( fi); Z=X*sin( fi)+Z*cos( fi); X=w;
в итоге у меня получится X(0,0,-1), Y(0,1,0), Z(1,0,0) правильно?
kroonk
ну вот и подставь X и Z вместо v1,v2, Z вообще не меняется
у тебя правильно
я подправил свой код нормализации
теперь вроде всё:
void PhisicheskaiaModel::Rotate(char* RVec, float Angle) { D3DXVECTOR3 W; float Ar = Angle * 2 * 3.14f / 360; if( RVec == "X") { W = VecY * cos( Ar) - VecZ * sin( Ar); VecZ = VecY * sin( Ar) + VecZ * cos( Ar); VecY = W; } if( RVec == "Y") { W = VecX * cos( Ar) - VecZ * sin( Ar); VecZ = VecX * sin( Ar) + VecZ * cos( Ar); VecX = W; } if( RVec == "Z") { W = VecX * cos( Ar) - VecY * sin( Ar); VecX = VecX * sin( Ar) + VecY * cos( Ar); VecY = W; } VecX = VecX * ( 1./length( VecX)); VecY = VecY - VecX * dot( VecY, VecX); VecY = VecY * ( 1./length( VecY)); VecZ = VecZ - VecX * dot( VecZ, VecX) - VecY * dot( VecZ, VecY); VecZ = VecZ * ( 1./length( VecZ)); }
Правильно?
P.S. у меня компилятор не знает что такое length и dot что надо подключить для решения этой проблемы?
kroonk
Ты приколист, компилятор и про вектора не знает, все сам пишешь
Разве вы не проходили длину вектора и скалярное произведение?
Если ты юзаешь Директукс, они там есть
Открой наконец учебник (Геометрия 6-10 класс, автор Погорелов), в нем великая сила!
> PhisicheskaiaModel
FizikModel, рус дилинда даныш )))
Aslan
> Если ты юзаешь Директукс, они там есть
Я использую DirectX я там векторы нашёл D3DXVECTOR3 а как называются lenght и dot? кстати они у меня в редакторе подсвечиваются синим цветом то-есть редактор их знает а компилятор нет.
kroonk
> lenght
Может быть, это length?
TarasB
точно, очепятка
kroonk
help почитай, или за тебя код писать?
TarasB
> Может быть, это length?
да опечатался но всё равно у меня length подсвечивается синим.
Aslan
> help почитай, или за тебя код писать?
зачем сразу код? просто как называются функции для этих вычислений.
Aslan
> Разве вы не проходили длину вектора и скалярное произведение?
Это может в москве или перми в 6 классе векторы изучают а у нас в Нытве в нашей школе алгебра с геометрией только сейчас в 7 классе начнётся а про векторы мы ещё только в классе наверное 8 или в конце седьмого узнаем.
kroonk
dot (A, B) - скалярное произведение векторов.
У нового вектора после умножения будут такие координаты:
x := Ax * Bx;
y := Ay * By;
Если векторы единичные, то получим косинус угла между ними:
dot (A, B) := Ax * Bx + Ay * By
P.S. Надеюсь, хоть щас не тупонул.
Length(A) длина вектора, или абсолютное значение
Length := sqrt(Ax * Ax + Ay * Ay).
kroonk
> зачем сразу код? просто как называются функции для этих вычислений
Я не ползуюсь Директсиксом, не знаю как они там называются
Length(Vector3 v) - длина вектора = sqrt(v.x*v.x+v.y*v.y+v.z*v.z)
Dot(Vector3 v1,Vector3 v2) - скалярное произведение векторов = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z
> Это может в москве или перми в 6 классе векторы изучают а у нас в Нытве в нашей школе алгебра с
> геометрией только сейчас в 7 классе начнётся а про векторы мы ещё только в классе наверное 8 или в конце
> седьмого узнаем
Незнаю как сейчас, а в советских школах геометрия была с 6го класса, векторы может с 7го
Если ты выбрал скользкий путь игрописания, то небойся заглядывать вперед школьной программы
>то небойся заглядывать вперед школьной
программы
+100500
Skunk
скалярное произведение возвращает СКАЛЯР (число)
Skunk
> dot (A, B) - скалярное произведение векторов
> У нового вектора после умножения будут такие координаты:
В перлы.
Тема в архиве.