Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 25.04.2009, 14:14   #1
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Радость Кротчайшее направление плавного разворота!

Опять похожая проблема.
В этот раз просто необходимо поворачивать плано объект в то же направление куда повернут другой объект-пивот. В примере для удобства я взял только поворот по оси игрек.

Вот код:
Graphics3D 1280, 1024, 32, 1

cam=CreateCamera()
CameraClsColor cam, 0, 100,255
CameraRange cam, 1, 1000
MoveEntity cam,0,0,-50
lit=CreateLight()
PositionEntity cam, 2, 10,-2



cube=CreateWCone()
EntityColor cube, 255,0,0

PointEntity cam, cube


pivot=CreateWCone()
PositionEntity pivot, 5,0,0
RotateEntity pivot, 0, Rand(0,360), 0


Repeat
	
	
	If Abs(EntityYaw(cube)-EntityYaw(pivot))<2 
		RotateEntity pivot, 0, Rand(0,360), 0
	EndIf
	
	
	
	SmoothTurn4(cube, pivot, 0.01)
	
	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 CreateWCone()
	f=CreateCone(4) 
	RotateMesh f,0,0,90
	ScaleMesh f, 1,2,2
	RotateMesh f, 45,90,0
	ScaleMesh f,1.2,1,1
	Return f
End Function

Function SmoothTurn4#(ent1,ent2,speed# = 1)
	
	smx#=(EntityPitch(ent2)-EntityPitch(ent1))*speed
	smy#=(EntityYaw(ent2)-EntityYaw(ent1))*speed
	smz#=(EntityRoll(ent2)-EntityRoll(ent1))*speed
	TurnEntity ent1, smx, smy, smz
	
End Function
Если внимательно приглядыватьтся то совсем несложно увидеть то что красный объект вовсе не всегда поворачивается так как это обычно происходит в жизни. Вместо того чтобы повернуться на -90 градусов, он к примеру повернйтся на 270, и наоборот. Вот именно этот недостаток необходимо устранить.
Я сам никак не могу додуматься как это возможно. Жду вашей помощи!
Спасибо!
(Offline)
 
Ответить с цитированием
Старый 25.04.2009, 14:36   #2
Main Cry
Оператор ЭВМ
 
Регистрация: 13.12.2008
Сообщений: 35
Написано 7 полезных сообщений
(для 12 пользователей)
Ответ: Кротчайшее направление плавного разворота!

Внутри блока
	If Abs(EntityYaw(cube)-EntityYaw(pivot))<2 
		RotateEntity pivot, 0, Rand(0,360), 0
	EndIf
поменяй Rand(0,360) на Rand(-180,180)

Последний раз редактировалось Main Cry, 25.04.2009 в 14:51.
(Offline)
 
Ответить с цитированием
Старый 25.04.2009, 16:59   #3
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Кротчайшее направление плавного разворота!

поменяй Rand(0,360) на Rand(-180,180)
Мм.Может я не прав, но тут разницы то никакой, при снятии yaw`ов получатся такиеже значения, блитц все подстраивает под себя в любом случае и преобразует любой угол поворота в промежуток [-180;180).
Но я попробовал - ничего не изменилось
Тут полюбому надо что-то с функцией делать. причем что-то хитрое.
Жду ещё ответов.
Спасибо Main Cry
(Offline)
 
Ответить с цитированием
Старый 25.04.2009, 18:36   #4
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Кротчайшее направление плавного разворота!

под -180..180 систему.

float AngleDist(float a1,float a2)
{
	if(a1-a2>180.0f)
		return  360.0f - (a1-a2);
	
	if(a1-a2<-180.0f)
		return 360.0f + (a1-a2);

	return a1-a2;
}

float AngleLerp(float a1,float a2,float scalar)
{
	return a1+AngleDist(a2,a1)*scalar;
}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ELIAS (26.04.2009)
Старый 25.04.2009, 19:33   #5
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Кротчайшее направление плавного разворота!

HolyDel, на блитце эти функции будут выглядеть так?
Function AngleDist#(a1#,a2#)
	If a1-a2>180 Then Return  360 - (a1-a2)
	
	If a1-a2<-180 Then Return 360 + (a1-a2)
End Function
		
		
		
Function AngleLerp#(a1#,a2#,scalar#)
	Return a1+AngleDist(a2,a1)*scalar
End Function
И в этом случае в моём коде вместо
SmoothTurn4(cube, pivot, 0.01)
пишем
RotateEntity cube, 0,  AngleLerp(EntityYaw(cube), EntityYaw(pivot), 0.01),0
Сделал. Фигурка вообще не вращается!!!!!! %(
(Offline)
 
Ответить с цитированием
Старый 25.04.2009, 21:01   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Кротчайшее направление плавного разворота!

я хз. вот пример:
http://sigelengine.googlecode.com/fi...leLerpTest.zip

правда на с++, но там не сложно. математика то одна для всех.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ELIAS (26.04.2009)
Старый 25.04.2009, 21:23   #7
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Кротчайшее направление плавного разворота!

Посмотрел, есть что-то общее конечно с моей проблемой, но уж совсем другое дело...Но имхо это не решит мою проблему - слишком сильно отличаются задачи((
(Offline)
 
Ответить с цитированием
Старый 25.04.2009, 21:53   #8
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Кротчайшее направление плавного разворота!

а.. ну ты используй AngleDist.
если меньше нуля - крути в одну сторону.
если больше - в другую.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ELIAS (26.04.2009)
Старый 25.04.2009, 22:01   #9
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Кротчайшее направление плавного разворота!

Graphics3D 640, 480, 32, 1

cam=CreateCamera()
CameraClsColor cam, 0, 100,255
CameraRange cam, 1, 1000
MoveEntity cam,0,0,-50
lit=CreateLight()
PositionEntity cam, 2, 10,-2



cube=CreateWCone()
EntityColor cube, 255,0,0

PointEntity cam, cube


pivot=CreateWCone()
PositionEntity pivot, 5,0,0
RotateEntity pivot, 0, Rand(0,360), 0

o1=0

Repeat
	
	
	If Abs(EntityYaw(cube)-EntityYaw(pivot))<1
		o1=EntityYaw(cube)
		RotateEntity pivot,0,  Rand(-180,180),0
	EndIf
	
	
	
	;SmoothTurn4(cube, pivot, 0.01)
	gh#=AngleLerp(EntityYaw(cube), EntityYaw(pivot), 1)
	RotateEntity cube, 0,  AngleLerp(EntityYaw(cube), EntityYaw(pivot), 0.04),0 
	
	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
	
	
	Text 20,20, "povorot = " + (EntityYaw(cube)-o1)
	
    Flip 60
	
	
	
	
Until KeyHit(1)
End

Function AngleDist#(a1#,a2#)
	If a1-a2>180 Then Return  360 - (a1-a2)
	
	If a1-a2<-180 Then Return 360 + (a1-a2)
	
	If a1-a2>-180 And a1-a2<180 Then Return a1-a2
End Function

		
		
		
Function AngleLerp#(a1#,a2#,scalar#)
	Return a1+AngleDist(a2,a1)*scalar
End Function


Function CreateWCone()
	f=CreateCone(4) 
	RotateMesh f,0,0,90
	ScaleMesh f, 1,2,2
	RotateMesh f, 45,90,0
	ScaleMesh f,1.2,1,1
	Return f
End Function

Function SmoothTurn4#(ent1,ent2,speed# = 1)
	
	smx#=(EntityPitch(ent2)-EntityPitch(ent1))*speed
	smy#=(EntityYaw(ent2)-EntityYaw(ent1))*speed
	smz#=(EntityRoll(ent2)-EntityRoll(ent1))*speed
	TurnEntity ent1, smx, smy, smz
	
End Function
Вот HolyDel, пока только это есть. Тут какбы используются твои алгоритмы. Результатов не дают.....((((
(Offline)
 
Ответить с цитированием
Старый 26.04.2009, 10:58   #10
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Кротчайшее направление плавного разворота!

Вот функция, плавно смешивает два угла, с учётом цикличности.
Function MergeAngles#(Angle1#,Angle2#,Morph#=.5)
   If Abs(Angle1-Angle2)>180
      If Angle1<Angle2
         Return Angle1-((360-Angle2)+Angle1)*(.5-(Morph-.5))
      Else
         Return Angle2-((360-Angle1)+Angle2)*(.5+(Morph-.5))
      EndIf
   Else
      Return Angle1*(Morph)+Angle2*(1.0-Morph)
   EndIf
End Function
Плавность не постоянная, и чем выше разница углов, тем выше скорость смещения к новому данному. Можно сделать и постоянную, либо любую другую модель смазывания, главное суть функции.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ELIAS (26.04.2009)
Старый 26.04.2009, 13:49   #11
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Ответ: Кротчайшее направление плавного разворота!

Огромное Спасибо, MoKa!!! Теперь всё окей, насчет непостоянности плавности - как раз такая мне и нужна, чтобы под конец затухала.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини-игра "Крот" is.SarCasm Проекты на Blitz3D 20 06.12.2009 05:07


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com