|
Опубликовано 09.01.2009 14:20 (16 лет назад) # |
Я за - сложно успеть за такой короткий срок. Делаю не с нуля, и то с большим трудом успеваю. Если +5 дней - может нормальный пострендер будет) |
|
|
|
Опубликовано 09.01.2009 14:24 (16 лет назад) # |
Я тоже за продление. Может даже успею шейдеры приделать и ещё фишки в геймпее добавлю, музыку наконец.
ЗЫ: решил всё таки поучаствовать.
редакция от Adler, 09.01.2009 15:16 |
|
|
|
Опубликовано 09.01.2009 15:26 (16 лет назад) # |
хм 9 дней , ну ладно я тоже за я много время упустил и тоже думаю что не всё учпею сделать что задумал..
Кстати тут тоже обсуждается тема физики авто, даже код выкладывают ;)
http://isadateam.com/forum/index.php?showtopic=127&pid=2442&st=0entry2442
редакция от JKot, 09.01.2009 15:32 |
|
|
|
Опубликовано 09.01.2009 15:39 (16 лет назад) # |
ИМХО самая сложная часть - collision detection. У меня всё упрощено донельзя, машинки как две окружности представлены. Кто как делает? |
|
|
|
Опубликовано 09.01.2009 15:52 (16 лет назад) # |
В самом начале написания игры, взял эту физику(она у меня давно и в C++ и в Delphi была переведена), но немножко подраздумывал и пришел к выводу, что для такой физики будет сложно писать AI !!! И решил писать простую физику, заносы тупо интерполяция вектора скорости к углу поворота корпуса, выходит вполне прикольно, даже весело. |
|
|
|
Опубликовано 09.01.2009 16:00 (16 лет назад) # |
Division написал:
ИМХО самая сложная часть - collision detection. У меня всё упрощено донельзя, машинки как две окружности представлены. Кто как делает?
Я еще не писал коллизии, пока так ездят сквозь дуруг-друга. Ну впринципе, если машинки аппроксимировать сферами, то можно их толкать, но силу задавать в соответствии с углами поворота корпуса ;), ну хз нужно подумать )) |
|
|
|
Опубликовано 09.01.2009 16:36 (16 лет назад) # |
сейчас пока что нахожусь в городе где родился DeePro Engine :)) 12-ого только смогу взяться за кодинг, а поучавствовать ужасно хочется... |
|
|
|
Опубликовано 09.01.2009 16:50 (16 лет назад) # |
2Hexman
Ну вот я и говорю 5 дней еще добавить.
2ViZgl
А можешь дать С++ код физики авто? :) |
|
|
|
Опубликовано 09.01.2009 18:21 (16 лет назад) # |
DRON написал:
ViZgl
А можешь дать С++ код физики авто? :)
Вот лови :)
#ifndef __CAR_PHYSIC__
#define __CAR_PHYSIC__
#include <math.h>
float sgn(float t)
{
if (t == 0.0f) return 0;
return t < 0.0f ? -1.0f : 1.0f;
}
struct CarParameter
{
public:
float kAF; //Коэффициент трения о воздух и в подвеске
float MaxFRCY; //Максимальная продольная сила трения, выше - пробуксовка
float MaxFRCX; //Максимальная поперечная сила трения, выше - занос
float MaxRotFRC; //Максимальная сила трения вращения
//Примерные значения MaxFRCY, MaxFRCX и MaxRotFRC:
//для асфальта - 20, 20, 10
//для льда - 5, 5, 3
//для гравия - 10,15, 5
float Power; //Мощность движка в квт, деленная на массу в кг(1 л.с. = 736 ватт)
//При мощности 165 л.с. и массе 1 т. Power = 165 * 0.736 / 1000
float CarSpeed; //Максимальная скорость без учета трения в м/с (1 км/ч = 0.278 м/с)
float Radius; //Радиус поворота в м.
float CtrlSens; //Чувствительность управления
float carExBack; //Расстояние от задней оси до центра тяжести в м.
char KPPMaxstep; // Число ступеней передач вперед
float KPP[10]; // Коэффициенты КПП
vec2 carSize;
};
class Car
{
public:
// Глобальные параметры
float Accel; // Текущее положение педали газа
float Break; // Текущее положение педали тормоза
float Steer; // Текущее положение руля
unsigned char KPPstep; // Текущая передача
float Speed; //Скорость
float CarX; //Координата X центра тяжести машины
float CarY; //Координата Y центра тяжести машины
float Alpha; //Угол поворота корпуса вокруг вертикальной оси Z
float SpeedAlpha; //Скорость вращения
float SpeedX; //X компонента вектора скорости
float SpeedY; //Y компонента вектора скорости
bool bTurnLeft;
bool bTurnRight;
bool bForward;
bool bBackward;
// Локальные параметры(для расчета сил, дейстующих на машину)
float SpX; //Скорость по локальной оси X
float SpY; //Скорость по локальной оси Y
float FrcX; //Сила по локальной оси X
float FrcY; //Сила по локальной оси Y
float ForceX; //Сила по оси X
float ForceY; //Сила по оси Y
float RotFRC; //Момент силы вращения
float tmp;
// Параметры машины
float kAF; //Коэффициент трения о воздух и в подвеске
float MaxFRCY; //Максимальная продольная сила трения, выше - пробуксовка
float MaxFRCX; //Максимальная поперечная сила трения, выше - занос
float MaxRotFRC; //Максимальная сила трения вращения
//Примерные значения MaxFRCY, MaxFRCX и MaxRotFRC:
//для асфальта - 20, 20, 10
//для льда - 5, 5, 3
//для гравия - 10,15, 5
float Power; //Мощность движка в квт, деленная на массу в кг(1 л.с. = 736 ватт)
//При мощности 165 л.с. и массе 1 т. Power = 165 * 0.736 / 1000
float CarSpeed; //Максимальная скорость без учета трения в м/с (1 км/ч = 0.278 м/с)
float Radius; //Радиус поворота в м.
float CtrlSens; //Чувствительность управления
float carExBack; //Расстояние от задней оси до центра тяжести в м.
char KPPMaxstep; // Число ступеней передач вперед
float KPP[10]; // Коэффициенты КПП
vec2 carSize;
Texture tex;
public:
Car()
{
bTurnLeft = false;
bTurnRight = false;
bForward = false;
bBackward = false;
Accel = 0.0f;
Break = 0.0f;
Steer = 0.0f;
KPPstep = 0;
Speed = 0.0f;
CarX = 0.0f;
CarY = 0.0f;
Alpha = 0.0f;
SpeedAlpha = 0.0f;
SpeedX = 0.0f;
Speed = 0.0f;
}
Car(CarParameter& param)
{
bTurnLeft = false;
bTurnRight = false;
bForward = false;
bBackward = false;
Accel = 0.0f;
Break = 0.0f;
Steer = 0.0f;
KPPstep = 0;
Speed = 0.0f;
CarX = 0.0f;
CarY = 0.0f;
Alpha = 0.0f;
SpeedAlpha = 0.0f;
SpeedX = 0.0f;
Speed = 0.0f;
carSize = 0.0f;
SetupParameters(param);
}
~Car() {}
void SetupParameters(CarParameter& param)
{
kAF = param.kAF;
MaxFRCY = param.MaxFRCY;
MaxFRCX = param.MaxFRCX;
MaxRotFRC = param.MaxRotFRC;
Power = param.Power;
CarSpeed = param.CarSpeed;
Radius = param.Radius;
CtrlSens = param.CtrlSens;
carExBack = param.carExBack;
KPPMaxstep = param.KPPMaxstep;
carSize = param.carSize;
for (int i=0; i < 10; ++i)
{
KPP[i] = param.KPP[i];
}
}
void update(float dt)
{
// Локальные параметры(для расчета сил, дейстующих на машину)
SpX = 0.0f; //Скорость по локальной оси X
SpY = 0.0f; //Скорость по локальной оси Y
FrcX = 0.0f; //Сила по локальной оси X
FrcY = 0.0f; //Сила по локальной оси Y
ForceX = 0.0f; //Сила по оси X
ForceY = 0.0f; //Сила по оси Y
RotFRC = 0.0f; //Момент силы вращения
tmp = 0.0f;
if (bForward)
{ // газ
Accel = Accel + CtrlSens * dt;
if (Accel > 1) Accel = 1.0f;
}
else
{ // Холостые обороты
Accel = Accel - CtrlSens * dt;
if (Accel < 0.1f) Accel = 0.1f;
}
if (bBackward)
{ // Тормоз
Break = Break + dt * CtrlSens;
if (Break > 1.0f) Break = 1.0f;
}
else
{ // Выровнять
Break = Break - dt * CtrlSens;
if (Break < 0.0f) Break = 0.0f;
}
if (bTurnRight)
{ // Поворот влево
Steer = Steer + CtrlSens * dt;
if (Steer > 0.5f) Steer = 0.5f;
}
else
if (bTurnLeft)
{ // Поворот вправо
Steer = Steer - CtrlSens * dt;
if (Steer < -0.5f) Steer = -0.5f;
}
else
//Выровнять
if (abs(Steer) < CtrlSens)
{
Steer = 0.0f;
}
else
{
Steer = Steer - dt * CtrlSens * sgn(Steer);
}
// обнулить значения
bTurnLeft = false;
bTurnRight = false;
bForward = false;
bBackward = false;
// Перевод величин в локальную систему координат автомобиля
if (SpeedY > 0.0000001f)
{
tmp = atanf(SpeedX / SpeedY);
}
else
{
if (SpeedY < -0.0000001f)
{
tmp = pi + atanf(SpeedX / SpeedY);
}
else
tmp = 1.570796f * sgn(SpeedX);
}
tmp -= Alpha;
Speed = sqrtf(SpeedX * SpeedX + SpeedY * SpeedY);
SpX = -Speed * sinf(tmp);
SpY = Speed * cosf(tmp);
// Расчет сил
if (KPPstep == 0)
{
FrcY = 0.0f; // Продольная сила
}
else
{
FrcY = (KPP[KPPstep] * CarSpeed * Accel - SpY) * Power / (KPP[KPPstep] * KPP[KPPstep]);
}
FrcY = FrcY - (Break / dt + kAF) * sgn(SpY);
FrcX = (-SpY * Steer * carExBack / Radius - SpX) / dt;
if (abs(FrcX) > MaxFRCX)
{
FrcX = MaxFRCX * sgn(FrcX); // занос
}
if (abs(FrcY) > MaxFRCY)
{
FrcY = MaxFRCY * sgn(FrcY); // пробуксовка
}
if (KPPstep == 0)
{
tmp = 0.0f;
}
else
{
tmp = 2.0f / (abs(KPP[KPPstep]) * CarSpeed);
}
RotFRC = (Steer * SpY / Radius - SpeedAlpha + SpX * Accel * tmp) / dt;
tmp = MaxRotFRC * (CarSpeed - SpY) / CarSpeed;
if (abs(RotFRC) > tmp)
{
RotFRC = sgn(RotFRC) * tmp;
}
// Перевод величин в мировую систему координат
ForceY = FrcY * cosf(Alpha) + FrcX * sinf(Alpha);
ForceX = FrcY * sinf(Alpha) - FrcX * cosf(Alpha);
SpeedAlpha += RotFRC *dt;
SpeedX += ForceX * dt;
SpeedY += ForceY * dt;
Alpha += SpeedAlpha * dt;
CarX += SpeedX * dt;
CarY -= SpeedY * dt;
}
void turnLeft()
{
bTurnLeft = true;
}
void turnRight()
{
bTurnRight = true;
}
void pressGas()
{
bForward = true;
}
void pressBreak()
{
bBackward = true;
}
void NextKPPStep()
{ // Передача +
if (KPPstep == 9)
KPPstep = 0;
else
if (KPPstep < KPPMaxstep)
{
KPPstep += 1;
}
}
void BackKPPStep()
{ // Передача -
if (KPPstep == 9) return;
else
if (KPPstep == 0)
{
KPPstep = 9;
}
else
{
if (KPPstep > 0)
{
KPPstep -= 1;
}
}
}
void render()
{ // !!!!!!!!!!!!!!!!!!!!!
glPushMatrix();
glTranslatef(CarX, CarY, 0.0f);
glRotatef(Alpha * 180.0f/pi, 0.0f, 0.0f, 1.0f);
tex.bind();
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex2f( - carSize.x, -carSize.y);
glTexCoord2f(0.0f, 0.0f); glVertex2f( - carSize.x, carSize.y);
glTexCoord2f(1.0f, 0.0f); glVertex2f( carSize.x, carSize.y);
glTexCoord2f(1.0f, 1.0f); glVertex2f( carSize.x, -carSize.y);
glEnd();
tex.unbind();
glPopMatrix();
}
};
#endif |
|
|
|
Опубликовано 09.01.2009 18:35 (16 лет назад) # |
ViZgl
Вау, почти готовая игра =) Может тоже скопи/пастить =) |
|
|
|
Опубликовано 09.01.2009 23:16 (16 лет назад) # |
блин, как ужасно, когда уже что-то работает и можно играть, но не удобно и не красиво. А ещё ужаснее то, что это невольно отвлекает от кодинга. Приходится всё отрубать и смотреть исключительно на то что отлаживается или приделывается. Так я уже отключил менюшку и убрал все объекты с цены. Клаву тоже вырубил. Оставил только мап, который сейчас настраиваю под редактор. :) |
|
|
|
Опубликовано 10.01.2009 06:06 (16 лет назад) # |
2ViZgl
Сенкс, сэкономил мне день работы :))
2Adler
А у меня много времени на подготовку графики уходит... саму игру накодить будет думаю довольно быстро. |
|
|
Инженер‑космогоник
|
Опубликовано 10.01.2009 07:27 (16 лет назад) # |
|
|
|
Инженер‑космогоник
|
Опубликовано 10.01.2009 07:38 (16 лет назад) # |
Ну не круто ли?
Сам удивился - это мое величайшее достижение в моделировании :)
как бы теперь сделать еще парочку.
А самое прикольное, что эти модели нужны только для текстуры вида сверху и карты освещения (я тоже разобрался и решил добавить бампа - для объема)
У меня есть модель передвижения, половина стрельбы (тока ракетки), аи, наворачивающий круги по маршруту, пыль, дым, следы шин, ускорение. Еще немного кривая модель передвижения - как по льду, заносы регулярно.
Нужно - коллизии, трамплины, всякие красивости, научить компа стрельбаться, сделать трассы и еще может чего.
Концепция - гонки по пустыне(ну или что-то апокалиптическое) со взрывами, вхождение в минимальные радиусы поворотов и стрельба. Хардрок в комплект не входит (качественные треки просто не влезут). |
|
|
Инженер‑космогоник
|
Опубликовано 10.01.2009 07:38 (16 лет назад) # |
Да я тоже за +5 дней |
|
|
|
Опубликовано 10.01.2009 09:26 (16 лет назад) # |
Mefistofel
Моделька прикольная) Будешь учить ИИ входить в минимальный радиус поворота? Я вот тоже думаю не помешает. |
|
|
Инженер‑космогоник
|
Опубликовано 10.01.2009 09:44 (16 лет назад) # |
Сейчас ии просто едет к конечной точке маршрута, доедет - возьмет следующую и тд. При это он входит во все повороты с математической точностью и офигительным заносом - ему то все равно.
Если его еще и в минимальные радиусы научить входить (маршрут то есть так составлять) он вообще всех рвать будет - это не нужно.
Я хочу его как нибудь поинтереснее сделать, может читерить его научить? Типа обгоняет тебя - снизить скорость, отстает - повысить?
Думаю сделать на точках маршрута метки - типа обычная метка - просто ехать, здесь поворот - притормози, здесь прямая - можно целится и стрелять, здезь узко - ставь мины и тд. |
|
|
|
Опубликовано 10.01.2009 09:49 (16 лет назад) # |
Мда у меня вообще пока ничего нет :( зато разум чист для новых идей :))) И по сравнению с вами будет Lo-gen, вообще я подумаю и может заюзаю пару фишек DPE хотя не хочется раньше времени :))) Думаю HDR с паралаксом будуи красиво сомтреться :) хотя не не буду... передумал... буду следовать плану ))))) у меня будут свои башнесносительные вещи о которых я не расскажу ))))
редакция от DRON, 10.01.2009 09:54 |
|
|
|
Опубликовано 10.01.2009 10:04 (16 лет назад) # |
to ViZgl
А какие параметры задать изначально нужно для твоего кода )
а-то на Делфи перевёл, а машинку с места сдвинуть не могу )). |
|
|
Администратор
|
Опубликовано 10.01.2009 13:49 (16 лет назад) # |
Mefistofel, очень круто |
|
|