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; } };
Suslik
Зачем так делать, надо один раз расчитать матрицу поворота и все
В данной теме достаточно поворота в 2д, вокруг перпендикулярной оси
TarasB
> В перлы.
В топку :)
Бывает и такое... *facepalm*
В военное время синус может достигать четырёх :)
всё исправил, сделал, как 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)); }
kroonk
>теперь будет работать?
:D
>теперь будет работать?
ну теперь то будет работать???:
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; }
kroonk
> ну теперь то будет работать???:
ну, братан, теперь-то точно работать не будет. до тех пор, пока ты не поймёшь, что делает тот код, ты его не сможешь заставить работать подобными методами. я бы советовал всё-таки разбираться с векторной математикой, особое внимание уделить скалярному и векторному произведению и только потом уже бросаться программировать.
kroonk
> ну теперь то будет работать?
Программирование методом тыка
1й твой вариант правильный, 2й нет
Сделай функции для повторяющихся фрагментов, тяжело читать твой код, нормализацию вызывай, повернув все три вектора, и то не каждый раз нужна. cos и sin вычисляй один раз, а не два. Про сравнение строк тебе уже писали, упорно не слушаешь
Елки, что же ты читать не хочешь?
kroonk
Тебе нужно геометрию изучить. Скалярное, векторное произведение, что такое проекции.
Возьми книжку, лист бумаги, попробуй повернуть вектор в направлении точки. Потом матрицу. Потом по координатам мыши в плоскости экрана матрицу игрока.
Желание жать побыстрей на кнопки нужно отучить. Сначала нужно ознакомиться с мат. аппаратом.
Aslan
> 1й твой вариант правильный, 2й нет
то-есть то что в посте №33 будет правильно работать?
ну скомпиль, да попробуй, никто ж не экстрасенс...
Поздравляю всех участников Специальной Олимпиады с открытием Параолимпийских Игр 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); }
Тема в архиве.