Беда с наклоном обьекта на ландшафте

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Беда с наклоном обьекта на ландшафте

Сообщение PilatP » 26.06.2013 (Ср) 8:48

Привет всем. Столкнулся с проблемой. Пишу игру типа Танки, столкнулся с проблемой, наклонов танка относительно ландшафта. Голову уже сломал. Уже высчитал вручную, (yy = n * (0.3 / 0.82468) )(0.3 наклон на единицу/0.82468 длина танка, n разница координат по Y) но все равно не работает. Если не сложно помогите. Я знаю что это должно решатся намного проще, беда в том не знаю как.
вот код. С определением точек проблем нет,проблема с формулой для вычисления угла.
Код: Выделить всё
Public Sub Rotate_Tank()
Dim xx As Single, yy As Single, zz As Single, n As Single, m As Single
Dim x1 As Single, z1 As Single, x2 As Single, z2 As Single
          CosA = Cos(-(User_Tank(User_Tank_Tek).rTank_Y + g_360d))
          SinA = Sin(-(User_Tank(User_Tank_Tek).rTank_Y + g_360d))
        'перед зад
        x1 = User_Tank(User_Tank_Tek).Pos_X + SinA * 1.25
        z1 = User_Tank(User_Tank_Tek).Pos_Z - CosA * 1.25
        x2 = User_Tank(User_Tank_Tek).Pos_X - SinA * 1.25
        z2 = User_Tank(User_Tank_Tek).Pos_Z + CosA * 1.25
        xx = LS.GetHeight(x1, z1)
        zz = LS.GetHeight(x2, z2)
        n = (xx - zz)
               
                yy = n * (0.3 / 0.82468)
        User_Tank(User_Tank_Tek).rTank_X = yy
         
        ' лево     право
          CosA = Cos(-(User_Tank(User_Tank_Tek).rTank_Y - g_90d))
          SinA = Sin(-(User_Tank(User_Tank_Tek).rTank_Y - g_90d))
        x1 = User_Tank(User_Tank_Tek).Pos_X + SinA * 0.75
        z1 = User_Tank(User_Tank_Tek).Pos_Z - CosA * 0.75
        x2 = User_Tank(User_Tank_Tek).Pos_X - SinA * 0.75
        z2 = User_Tank(User_Tank_Tek).Pos_Z + CosA * 0.75
       
        xx = LS.GetHeight(x1, z1)
        zz = LS.GetHeight(x2, z2)
        'Draw_Metka x1, LS.GetHeight(x1, z1), z1
        'Draw_Metka x2, LS.GetHeight(x2, z2), z2
        If xx > zz Then
            n = (zz - xx)
        Else:
            n = (xx - zz)
        End If
       
               yy = n / 0.5
        User_Tank(User_Tank_Tek).rTank_Z = yy

End Sub


Когда танк стоит строго по x или z проблем практически нет, но при попытке развернутся вокруг оси, стоя на уклоне, танк то подымается то в верх, то зарывается в низ. Я думаю что при повороте танка под 45* или 90*, смещаются между собой и углы "User_Tank(User_Tank_Tek).rTank_Z"
Я не волшебник, я только учусь)

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Беда с наклоном обьекта на ландшафте

Сообщение PilatP » 27.06.2013 (Чт) 11:03

По ходу все на море?! :D :D :D
Я не волшебник, я только учусь)

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Беда с наклоном обьекта на ландшафте

Сообщение DODge » 27.06.2013 (Чт) 11:13

PilatP писал(а):По ходу все на море?! :D :D :D

Ну так конечно, все телепаты в отпуске!

У тебя полно переменных, назначение которых знаешь только ты, и даже не потрудился объяснить их нам.

Во-первых, проще всего рассчитать угол наклона по нормали треугольника, на котором в данный момент стоит твой танк.
Во-вторых, если хочешь чтобы твой танк плавно наклонялся во время езды по ландшафту, делаешь больше точек соприкосновения и интерполируешь их.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Беда с наклоном обьекта на ландшафте

Сообщение PilatP » 27.06.2013 (Чт) 12:02

Код: Выделить всё
Public Sub Rotate_Tank()
Dim xx As Single, yy As Single, zz As Single, n As Single, m As Single
Dim x1 As Single, z1 As Single, x2 As Single, z2 As Single
          CosA = Cos(-(User_Tank(User_Tank_Tek).rTank_Y + g_360d))
          SinA = Sin(-(User_Tank(User_Tank_Tek).rTank_Y + g_360d))
        'перед зад
        x1 = User_Tank(User_Tank_Tek).Pos_X + SinA * 1.25   'х1 и z1 координата спереди танка
        z1 = User_Tank(User_Tank_Tek).Pos_Z - CosA * 1.25
        x2 = User_Tank(User_Tank_Tek).Pos_X - SinA * 1.25    'х2 и z2 координата сзади танка
        z2 = User_Tank(User_Tank_Tek).Pos_Z + CosA * 1.25
        xx = LS.GetHeight(x1, z1)  'xx высота спереди танка
        zz = LS.GetHeight(x2, z2)   'zz высота сзади танка
        n = (xx - zz)
               
                yy = n * (0.3 / 0.82468)  ' вот тут проблема yy это угол наклона вперед назад
        User_Tank(User_Tank_Tek).rTank_X = yy
         
        ' лево     право
          CosA = Cos(-(User_Tank(User_Tank_Tek).rTank_Y - g_90d))
          SinA = Sin(-(User_Tank(User_Tank_Tek).rTank_Y - g_90d))
        x1 = User_Tank(User_Tank_Tek).Pos_X + SinA * 0.75      'х1 и z1 координата слева танка
        z1 = User_Tank(User_Tank_Tek).Pos_Z - CosA * 0.75
        x2 = User_Tank(User_Tank_Tek).Pos_X - SinA * 0.75      'х2 и z2 координата справа танка
        z2 = User_Tank(User_Tank_Tek).Pos_Z + CosA * 0.75
       
        xx = LS.GetHeight(x1, z1)  'xx высота слева по средине танка
        zz = LS.GetHeight(x2, z2)   'zz высота справа по средине танка
        'Draw_Metka x1, LS.GetHeight(x1, z1), z1
        'Draw_Metka x2, LS.GetHeight(x2, z2), z2
        If xx > zz Then
            n = (zz - xx)
        Else:
            n = (xx - zz)
        End If
       
               yy = n / 0.5    ' вот тут проблема yy это угол наклона влево вправо
        User_Tank(User_Tank_Tek).rTank_Z = yy

End Sub


Может есть алгоритм вычисления наклонов,по проще. Но с математикой и геометрией у меня плохо. Если есть код, желательно с коментами, буду очень благодарен. В принципе код рабочий за исключением вычисления угла. Когда танк стоит по осям XZ, все нормально, но повернув его на 45* относительно осей тут и вылазит бок.
Я не волшебник, я только учусь)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Беда с наклоном обьекта на ландшафте

Сообщение Mikle » 27.06.2013 (Чт) 15:40

Я давал демку ss3d, где машинка-коробка едет по ландшафту. Там есть эти вычисления.
DODge писал(а):полно переменных, назначение которых знаешь только ты, и даже не потрудился объяснить их нам.

+1, разбираться крайне влом.

DODge
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 30.07.2006 (Вс) 0:25
Откуда: Нижний Новгород

Re: Беда с наклоном обьекта на ландшафте

Сообщение DODge » 27.06.2013 (Чт) 20:07

Mikle писал(а):Я давал демку ss3d, где машинка-коробка едет по ландшафту. Там есть эти вычисления.
У вас нет доступа для просмотра вложений в этом сообщении.
CPU = Intel Core i5 6500 @ 3.2 GHz
VGA = GeForce GTX 650Ti 2Gb
RAM = 8 ГБ DDR4 @ 2133 MHz
OS = Windows 10 Pro 64-bit
IDE = Microsoft Visual Studio Community 2017 (Visual Basic.NET)
GAPI = SharpDX 9 + 12

PilatP
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 117
Зарегистрирован: 24.08.2009 (Пн) 1:00
Откуда: Херсон

Re: Беда с наклоном обьекта на ландшафте

Сообщение PilatP » 28.06.2013 (Пт) 18:24

Я давал демку ss3d, где машинка-коробка едет по ландшафту. Там есть эти вычисления.

Спасибо всем что откликнулись, у меня Mikle не было этого исходника, по этому и не мог разобратся, у меня есть исходник другой с твоей игрой, но я там не разобрался, много кода. Спасибо сейчас буду разбиратся :D :D :D
Я не волшебник, я только учусь)


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

    TopList  
cron