forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Smooth turn entity (http://forum.boolean.name/showthread.php?t=8057)

ELIAS 25.03.2009 20:11

Smooth turn entity
 
Надо поворачивать ентити плавно.Это вообще не трудно конечно:) Я сделал простым применением функции CurveValue(). Но тут видимо что-то посложнее надо:( Дело в том что когда ентити поврачивается на заданный объект(пивот) за несколько проходов, то мы сможем наблюдать то, как ентити вовсе не всегда "выбирает" кротчайшее направление поворота! В жизни никто так не поступает, если не специально:) Поэтому такое поведение к примеру монстра будет выглядеть крайне неестественно:(
К примеру, бот развернут на 10 градусов > поступает команда развернутся к 355 градусам. И бот вместо выитания 15 градусов, начинает разворачиваться на 345 градусов в положительном направлении.

ЗЫ:::Кстати в блитце градусная система представлет из себе полуинтервал [-180; 180) - зачееем??? Неужели удобно так? Почему не сделать так как на уроках геометрии [0; 360) ???

Так короче, вы могли бы всё это не читать кроме "ЗЫ", вот код - там всё есть :)
Код:

Graphics3D 1280, 1024, 32, 1

cam=CreateCamera()
CameraClsColor cam, 0, 100,255
MoveEntity cam,0,0,-50
lit=CreateLight()


cube=CreateCube() : ScaleMesh cube, 10, 10 ,10

pivot=CreatePivot()
PositionEntity pivot, Rand(-500, 500), 0, Rand(-500, 500)



Repeat
       
       
        If EntityDistance(cube, pivot)< 20 Then PositionEntity pivot, Rand(-500, 500), 0, Rand(-500, 500)
       
       
        oldangx#=EntityPitch(cube)
        oldangy#=EntityYaw(cube)
        oldangz#=EntityRoll(cube)
       
        PointEntity cube, pivot
        MoveEntity cube, 0, 0, 0.6
       
       
        angx#=EntityPitch(cube)
        angy#=EntityYaw(cube)
        angz#=EntityRoll(cube)
       
       
        angx#=CurveValue(angx, oldangx, 0.02)
        angy#=CurveValue(angy, oldangy, 0.02)
        angz#=CurveValue(angz, oldangz, 0.02)
       
        RotateEntity cube, angx, angy, angz
       
       
       
       
        If KeyDown(200)=1 Then MoveEntity cam, 0,0,0.5
        If KeyDown(208)=1 Then MoveEntity cam, 0,0,-0.5
       
        RotateEntity cam, EntityPitch(cam)+MouseYSpeed()*0.2, EntityYaw(cam)-MouseXSpeed()*0.2 ,0
       
        MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
       
       
       
       
        UpdateWorld
    RenderWorld
       
    Flip 60
       
Until KeyHit(1)
End



Function CurveValue#(v#,old#,f#)
        Return old#+((v#-old#)*f#)
End Function

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

Ну я думаю, что проблема такая распространённая, что наверняка кто-нибудь её решал. Пожалуйста поредактируйте код.

Всем спасибо:)

HolyDel 25.03.2009 20:12

Ответ: Smooth turn entity
 
см. DeltaYaw, DeltaPitch

ABTOMAT 25.03.2009 20:51

Ответ: Smooth turn entity
 
DeltaYaw'ом определяй разность углов и если она больше 180° то поворачивай в противоположную сторону.
Цитата:

ЗЫ:::Кстати в блитце градусная система представлет из себе полуинтервал [-180; 180) - зачееем??? Неужели удобно так? Почему не сделать так как на уроках геометрии [0; 360) ???
Меня это тоже бесило... Особенно когда делал перемещение персонажа на PhysX'е - та ещё жесть... Зачем? Марку Сибли виднее

HolyDel 25.03.2009 20:55

Ответ: Smooth turn entity
 
мне кажется [-180; 180) удобнее чем [0; 360)

ELIAS 25.03.2009 21:25

Ответ: Smooth turn entity
 
Всё рано не понятно... Разность углов между чем и чем...не получается у меня ничего:(((
Можно всё таки кодом...пожаалуйста!!..

HolyDel 25.03.2009 22:01

Ответ: Smooth turn entity
 
Код:

function smoothturn(ent1,ent2,speed# = 1)
s# = DeltaYaw(ent1,ent2)
turnentity ent1,0,speed * sign(s),0
endfunction

как то так

ABTOMAT 25.03.2009 22:16

Ответ: Smooth turn entity
 
Цитата:

Сообщение от HolyDel (Сообщение 101771)
мне кажется [-180; 180) удобнее чем [0; 360)

Нуу... Но когда где-то оно не совпадает с другим, то это кащмар!

ELIAS 25.03.2009 22:30

Ответ: Smooth turn entity
 
Цитата:

function smoothturn(ent1,ent2,speed# = 1)
s# = DeltaYaw(ent1,ent2)
turnentity ent1,0,speed * sign(s),0
endfunctionкак то так
че такое sign ?????

jimon 25.03.2009 22:34

Ответ: Smooth turn entity
 
ELIAS
прочитай справку

HolyDel 25.03.2009 22:44

Ответ: Smooth turn entity
 
sign от 0 == 0
sign от >0 == 1
sign от <0 == -1

ABTOMAT 25.03.2009 23:27

Ответ: Smooth turn entity
 
Sgn, может?
Не мешайте сяху с бейсиком!

HolyDel 25.03.2009 23:28

Ответ: Smooth turn entity
 
ну... тогда я неправ - тогда sgn. он бы ее еще sn назвал. или вообще - s.

ABTOMAT 25.03.2009 23:32

Ответ: Smooth turn entity
 
В классическом бейсике именно sgn, так что Марк тут оказался совершено прав :)

ELIAS 26.03.2009 14:51

Ответ: Smooth turn entity
 
Спасибо, HolyDel, АВТОМАТ !

Hellfalcon 27.03.2009 01:14

Ответ: Smooth turn entity
 
еще можно так
Цитата:

Function EntityPoint(Entity,Point)
;========================================
;b - коректирующий угол .
AngleEntityUp_Target#=pointAtxy(Entity,Point)+b
AngleEntityUp#=EntityYaw(Entity)
;============================================
;перевод углов в нормальные ~0-359
If AngleEntityUp_Target<0 Then AngleEntityUp_Target=(180-Abs(AngleEntityUp_Target))+180
If AngleEntityUp<0 Then AngleEntityUp=(180-Abs(AngleEntityUp))+180
;================================================= ======
;условия для поворота в кратчайшую сторону
If (((Abs(AngleEntityUp-AngleEntityUp_Target))<=180) And (AngleEntityUp<AngleEntityUp_Target)) Or (((Abs(AngleEntityUp-AngleEntityUp_Target))>180) And (AngleEntityUp>AngleEntityUp_Target)) Then

AngleRotate=1
Else
AngleRotate=-1
End If

RotateEntity Entity,EntityPitch(Entity,1),EntityYaw(Entity)+Ang leRotate,EntityRoll(Entity,1),1
end function

Function pointAtxy#(p1,p2)
;==============================
;!!!!!!!!!
dx#=EntityX(p1,1)-EntityX(p2,1)
dy#=EntityZ(p1,1)-EntityZ(p2,1)
;!!!!!!!!
Return ATan2#(dy,dx)

End Function


Halk-DS 27.03.2009 03:24

Ответ: Smooth turn entity
 
Цитата:

мне кажется [-180; 180) удобнее чем [0; 360)
Да там вроде вобще почти по барабану. К сменной +180 и выйдет 0 - 360;
А если не прибавлять, то будет 180 - 180

H@NON 27.03.2009 15:52

Ответ: Smooth turn entity
 
агась, Марк решил не заморачиваться и Cos и Sin просто умножать на 180, тогда получается градус :)

impersonalis 28.03.2009 17:18

Ответ: Smooth turn entity
 
Цитата:

Сообщение от H@NON (Сообщение 101934)
агась, Марк решил не заморачиваться и Cos и Sin просто умножать на 180, тогда получается градус :)

:4to:

CRASHER 30.03.2009 00:23

Ответ: Smooth turn entity
 
Я наверно поздновато, но может поможет. Мне кажется этот вариант отличается от других, предложенных выше.

Function track_YR_Smooth(e1,e2,smothness#=1.0)
PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
PointEntity gPivot1,e2
RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smo thness#),0
End Function

Function curveangle#( newangle#,oldangle#,increments#)
If increments>1
If (oldangle+360)-newangle<newangle-oldangle
oldangle=360+oldangle
End If
If (newangle+360)-oldangle<oldangle-newangle
newangle=360+newangle
End If
oldangle=oldangle-(oldangle-newangle)/increments
End If
If increments<=1
Return newangle
End If
Return oldangle

End Function


Часовой пояс GMT +4, время: 20:46.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot