Тема: Smooth turn entity
Показать сообщение отдельно
Старый 25.03.2009, 20:11   #1
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
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
Ну чисто я так утрировал в том плане что вооброжаемый монстр повёртывается только по игрек-оси. На самом деле по всем бы надо просто хуже будет видно.
Чтобы хорошо наблюдать за кубом рекомендую наблюдать сверху, летите наверх - и опускайте камеру вниз.

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

Всем спасибо
(Offline)
 
Ответить с цитированием