ПрограммированиеФорумФизика

Снова угловая скорость. (2 стр)

Страницы: 1 2 3 4 5 Следующая »
#15
7:20, 14 июня 2011

Suslik
> Переходишь в двумерную систему координат
Я примерно это и пытался реализовать. Как надо правильно перейти в двумерную систему координат и переместить туда векторы.

#16
9:31, 14 июня 2011

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" - глаза режет, лучше называй грамотно по русски чем так

#17
10:05, 14 июня 2011

что-то я вообще запутался, вот у меня изначально 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) правильно?

#18
10:28, 14 июня 2011

kroonk
ну вот и подставь X и Z вместо v1,v2, Z вообще не меняется
у тебя правильно
я подправил свой код нормализации

#19
10:47, 14 июня 2011

теперь вроде всё:

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 что надо подключить для решения этой проблемы?

#20
11:51, 14 июня 2011

kroonk
Ты приколист, компилятор и про вектора не знает, все сам пишешь
Разве вы не проходили длину вектора и скалярное произведение?
Если ты юзаешь Директукс, они там есть
Открой наконец учебник (Геометрия 6-10 класс, автор Погорелов), в нем великая сила!

> PhisicheskaiaModel
FizikModel, рус дилинда даныш )))

#21
12:16, 14 июня 2011

Aslan
> Если ты юзаешь Директукс, они там есть
Я использую DirectX я там векторы нашёл D3DXVECTOR3 а как называются lenght и dot? кстати они у меня в редакторе подсвечиваются синим цветом то-есть редактор их знает а компилятор нет.

#22
12:20, 14 июня 2011

kroonk
> lenght

Может быть, это length?

#23
12:26, 14 июня 2011

TarasB
точно, очепятка
kroonk
help почитай, или за тебя код писать?

#24
12:46, 14 июня 2011

TarasB
> Может быть, это length?
да опечатался но всё равно у меня length подсвечивается синим.
Aslan
> help почитай, или за тебя код писать?
зачем сразу код? просто как называются функции для этих вычислений.
Aslan
> Разве вы не проходили длину вектора и скалярное произведение?
Это может в москве или перми в 6 классе векторы изучают а у нас в Нытве в нашей школе алгебра с геометрией только сейчас в 7 классе начнётся а про векторы мы ещё только в классе наверное 8 или в конце седьмого узнаем.

#25
13:10, 14 июня 2011

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).

#26
13:34, 14 июня 2011

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го
Если ты выбрал скользкий путь игрописания, то небойся заглядывать вперед школьной программы

#27
13:59, 14 июня 2011

>то небойся заглядывать вперед школьной
программы
+100500

#28
14:17, 14 июня 2011

Skunk
скалярное произведение возвращает СКАЛЯР (число)

#29
15:25, 14 июня 2011

Skunk
> dot (A, B) - скалярное произведение векторов
> У нового вектора после умножения будут такие координаты:

В перлы.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.