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

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

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

Aslan
> И, да, "PhisicModel" - глаза режет, лучше называй грамотно по русски чем так
kroonk
> PhisicheskaiaModel
под расстрел, без вариантов. если не уверен, как пишется слово - лезешь в словарь и убеждаешься. никто в твоём коде с подобным названием переменных разбираться не будет.

kroonk
> теперь вроде всё:
> <ужас />
> Правильно?
когда я говорил о повороте одного вектора вокруг другого, я имел в виду поворот вокруг произвольного вектора, а не одного из базисных векторов. То есть функция должна принимать на вход некоторый вектор - ось вращения.

kroonk
> Это может в москве или перми в 6 классе векторы изучают а у нас в Нытве в нашей
> школе алгебра с геометрией только сейчас в 7 классе начнётся а про векторы мы
> ещё только в классе наверное 8 или в конце седьмого узнаем.
Никто тебя геймдеву учить не будет ни в восьмом классе ни на третьем курсе института. Если тебе что-то нужно - открываешь учебник/википедию и читаешь сам. Так было всегда и везде, не надейся, что кто-то до тебя эти знания донесёт.

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

Я могу запостить свой код поворота вектора вокруг вектора, но это мало чем поможет, если ты однажды не пришёл к чему-то подобному:

template<typename T>
struct Vector3
{
//...
  void  Rotate(const Vector3 &axis, const T angle)
  {
    Vector3<T> self = *this;
    Vector3<T> x = self - axis * (axis * self);
    Vector3<T> y = x ^ axis;
    Vector3<T> delta = x * cos(angle) + y * sin(angle) - x;
    self += delta;
    *this = self;
  }
};
#31
16:35, 14 июня 2011

Suslik
Зачем так делать, надо один раз расчитать матрицу поворота и все
В данной теме достаточно поворота в 2д, вокруг перпендикулярной оси

#32
16:39, 14 июня 2011

TarasB
> В перлы.
В топку :)
Бывает и такое... *facepalm*

В военное время синус может достигать четырёх :)

#33
21:20, 14 июня 2011

всё исправил, сделал, как Aslan написал теперь будет работать?:

void a::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./sqrt(VecX.x * VecX.x + VecX.y * VecX.y + VecX.z * VecX.z));
  VecY = VecY - VecX * (VecY.x * VecX.x + VecY.y * VecX.y + VecY.z * VecX.z);
  VecY = VecY * (1./sqrt(VecY.x * VecY.x + VecY.y * VecY.y + VecY.z * VecY.z));
  VecZ = VecZ - VecX * (VecZ.x * VecX.x + VecZ.y * VecX.y + VecZ.z * VecX.z) - VecY * (VecZ.x * VecY.x + VecZ.y * VecY.y + VecZ.z * VecY.z);
  VecZ = VecZ * (1./sqrt(VecZ.x * VecZ.x + VecZ.y * VecZ.y + VecZ.z * VecZ.z));
}
#34
0:28, 15 июня 2011

kroonk
>теперь будет работать?
:D

#35
0:40, 15 июня 2011

>теперь будет работать?
Изображение

#36
6:52, 15 июня 2011

ну теперь то будет работать???:

D3DXVECTOR3 RVV(D3DXVECTOR3 V1, D3DXVECTOR3 V2, float Angle)
{
  float angle = Angle * 2 * 3.14 / 360;
  D3DXVECTOR3 Self = V1;
  D3DXVECTOR3 X;
  X.x = Self.x - V2.x * (V2.x * V1.x);
  X.y = Self.y - V2.y * (V2.y * V1.y);
  X.z = Self.z - V2.z * (V2.z * V1.z);
  D3DXVECTOR3 Y;
  Y.x = (int)X.x ^ (int)V2.x;
  Y.y = (int)X.y ^ (int)V2.y;
  Y.z = (int)X.z ^ (int)V2.z;
  D3DXVECTOR3 Delta = X * cos(angle) + Y * sin(angle) - X;
  Self += Delta;
  D3DXVECTOR3 OV;
  OV = Self;
  return OV;
}
#37
6:57, 15 июня 2011

kroonk
> ну теперь то будет работать???:
ну, братан, теперь-то точно работать не будет. до тех пор, пока ты не поймёшь, что делает тот код, ты его не сможешь заставить работать подобными методами. я бы советовал всё-таки разбираться с векторной математикой, особое внимание уделить скалярному и векторному произведению и только потом уже бросаться программировать.

#38
8:29, 15 июня 2011

kroonk
> ну теперь то будет работать?
Программирование методом тыка
1й твой вариант правильный, 2й нет
Сделай функции для повторяющихся фрагментов, тяжело читать твой код, нормализацию вызывай, повернув все три вектора, и то не каждый раз нужна. cos и sin вычисляй один раз, а не два. Про сравнение строк тебе уже писали, упорно не слушаешь
Елки, что же ты читать не хочешь?

#39
12:22, 15 июня 2011

kroonk
Тебе нужно геометрию изучить. Скалярное, векторное произведение, что такое проекции.
Возьми книжку, лист бумаги, попробуй повернуть вектор в направлении точки. Потом матрицу. Потом по координатам мыши в плоскости экрана матрицу игрока.
Желание жать побыстрей на кнопки нужно отучить. Сначала нужно ознакомиться с мат. аппаратом.

#40
14:17, 15 июня 2011

Aslan
> 1й твой вариант правильный, 2й нет
то-есть то что в посте №33 будет правильно работать?

#41
14:37, 15 июня 2011

ну скомпиль, да попробуй, никто ж не экстрасенс...

#42
15:06, 15 июня 2011

Поздравляю всех участников Специальной Олимпиады с открытием Параолимпийских Игр 2011 :)

#43
15:18, 15 июня 2011

:)

#44
18:41, 15 июня 2011

kroonk

// Возвращает квадрат длины вектора
// посмотри в DX есть готовые функции
float length2(const D3DXVECTOR3& v)
{
  return v.x*v.x+v.y*v.y+v.z*v.z;
}

// Возвращает длину вектора
float length(const D3DXVECTOR3& v)
{
  return sqrt(length2(v));
}

// Возвращает скалярное произведение двух векторов
float dot(const D3DXVECTOR3& v1, const D3DXVECTOR3& v2)
{
  return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;
}


// оператор умножения вектора на число, модифицирует вектор и возвращает ссылку на него
// В DХ он определен уже чтоли, раз у тебя скомпилилось?
D3DXVECTOR3& operator *= (D3DXVECTOR3& v, float k)
{
  v.x*=k;
  v.y*=k;
  v.z*=k;
  return v;
}

// нормализует вектор (приводит к длине 1)
void Normalize(D3DXVECTOR3& v)
{
  v*=(1./length(v));
}

void a::Rotate(int axis, float angle)
{
  D3DXVECTOR3 W;

  // почему сразу в радианах не передаешь?
  float ar = angle * 2 * 3.14f / 360;

  float cosa = cosa;
  float sina = sina;

  if(axis==0) // Вращ YZ вокруг X
  {
    W = VecY * cosa - VecZ * sina;
    VecZ = VecY * sina + VecZ * cosa;
    VecY = W;
  }
  else
  if(axis==1) // Вращ ZX вокруг Y
  {
    W = VecZ * cosa - VecX * sina;
    VecX = VecZ * sina + VecX * cosa;
    VecZ = W;
  }
  else
  if(axis==2) // Вращ XY вокруг Z
  {
    W = VecX * cosa - VecY * sina;
    VecY = VecX * sina + VecY * cosa;
    VecX = W;
  }

  Normalize();
}


// нормализовать матрицу (систему из 3х векторов)
void a::Normalize()
{
  Normalize(VecX);
  VecY-=VecX*sprod(VecY,VecX);
  Normalize(VecY);
  VecZ-=(VecX*sprod(VecZ,VecX)+VecY*sprod(VecZ,VecY));
  Normalize(VecZ);
}
Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумФизика

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