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

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

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

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

Ответ
 
Опции темы
Старый 25.11.2005, 12:01   #16
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Для плавности надо сделать камере какую-то скорость поворота и скорость движения.

Псевдокод такой:
================================================== ===============
ЕСЛИ модуль (Abs) угола между игроком и камерой (DeltaYaw(camera,player)) больше shagAngle#, ТО
крутим камеру, чтобы уменьшить этот угол:
TurnEntity camera,0,Sgn(DeltaYaw(camera,player))*shagAngle#,0
ИНАЧЕ
TurnEntity camera,0,Sgn(DeltaYaw(camera,player))*DeltaYaw(cam era,player),0
этот поворот нужен для того, чтобы не было дерганья камеры
КонецЕСЛИ
================================================== ===============

shagAngle# может иметь фиксированное значение, например shagAngle# = 5.0, а может и переменное, например shagAngle# = DeltaYaw(camera,player) * 0.1 <--- в этом (втором) случае движение будет с ускорением: сначала быстро, потом медленнее...

Чё-нить понял из этого?
(Offline)
 
Ответить с цитированием
Старый 25.11.2005, 16:44   #17
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Посмотри этот код, я комментарии везде поставил, должно быть всё понятно. Новые места отмечены ;============

Graphics3D 800,600,32,2
SetBuffer BackBuffer()


Global player

Const typeplayer=1
Const typescene=2
Const typecamera=3


;=========================================================================
;тип, содержащий инфу о следящей камере
;entity - объект, за которым надо следить
;camera - сама камера
;target - пивот, место которого стремится занять камера
;если entity (наш игрок) стоит на месте, то камера тут будет
;heading - пивот, на который "смотрит" камера
;Z# - смещение по оси Z относительно entity (нашего игрока)
;Y# - смещение по оси Y
Type ChaseCam
	Field entity,camera,target,heading
	Field Z#
	Field Y#
End Type
;=========================================================================




scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;=========================================================================
;создаём объект cam как экземпляр типа ChaseCam
;т.к. в параметре функции указали player, то камера
;будет следить за игроком
Global cam.ChaseCam = CreateChaseCam.ChaseCam(player)
;=========================================================================


;------------------------------------------------;

PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3

;=========================================================================
;устанавливаем колизию камеры со сценой
Collisions typecamera,typescene,2,3
;=========================================================================



Repeat

;=========================================================================
;обновляем состояние камеры
UpdateChaseCam(cam)
;=========================================================================

TranslateEntity player,0,-1,0

spd#=0.5

;If KeyDown(75) TurnEntity camera,0,1,0
;If KeyDown(77) TurnEntity camera,0,-1,0
;If KeyDown(72) TurnEntity camera,1,0,0
;If KeyDown(80) TurnEntity camera,-1,0,0
;If KeyDown(71) MoveEntity camera,0,0,1
;If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,spd#
If KeyDown(208) MoveEntity player,0,0,-spd#
If KeyDown(203) TurnEntity player,0,3,0
If KeyDown(205) TurnEntity player,0,-3,0



UpdateWorld
RenderWorld
Flip
Until KeyHit(1)

End


;=========================================================================
;эта функция создаёт и возвращает объект типа ChaseCam
Function CreateChaseCam.ChaseCam( entity )
;создаём объект
Local C.ChaseCam=New ChaseCam
C\entity=entity
;создаём камеру
c\camera=CreateCamera()

;устанавливаем начальное смещение
C\Z#=-10
C\Y#=5

;создаём цель, к этой точке будет стремиться камера
C\target=CreatePivot( entity )
;ставим цель на нужное место
PositionEntity C\target,0,C\Y#,C\Z#
;тип для колизии
EntityType C\target,typecamera

;точка, в которую камера будет смотреть
;т.к. не меняем её позицию, то
;смотреть будем на entity (игрока)
C\heading=CreatePivot( entity )

Return C
End Function

;функция обновления состояния камеры
Function UpdateChaseCam( C.ChaseCam )

;1 - сделать вид от 1го лица
If KeyHit(2) Then 
	C\Z#=-0.1 C\Y#=0
	EntityAlpha player,0
End If

;2 - сделать вид от 3го лица, ближе
If KeyHit(3) Then 
	C\Z#=-5 C\Y#=2
	EntityAlpha player,1
End If

;3 - сделать вид от 3го лица, дальше
If KeyHit(4) Then 
	C\Z#=-10 C\Y#=5
	EntityAlpha player,1
End If

;получаем расстояние по трём осям между
;пивотом-целью и текущим положением камеры
dx#=EntityX(C\target,True)-EntityX(C\camera,True)
dy#=EntityY(c\target,True)-EntityY(c\camera,True)
dz#=EntityZ(C\target,True)-EntityZ(C\camera,True)

;двигаем камеру в сторону цели со скоростью
;в 1/10 расстояния мужду ними
TranslateEntity C\camera,dx*.05,dy*.05,dz*.05

;ограничение по оси Y точки, в которую
;смотрит камера (щас не используется,
;т.к. позицию heading нигде не меняем)
If EntityY#(C\heading)>40 Then PositionEntity(C\heading,EntityX#(C\heading),40,EntityZ#(C\heading))
If EntityY#(C\heading)<-50 Then PositionEntity(C\heading,EntityX#(C\heading),-50,EntityZ#(C\heading))

;заставляем камеру пялиться в нужную точку
PointEntity C\camera,C\heading

;здесь мы двигаем цель вплотную к объекту (игроку)
PositionEntity C\target,0,0,0
;теперь сбрасываем колизию для цели,
;чтобы камера не проходила сквозь стены
ResetEntity C\target
;и ставим её в фиксированное положение,
;которое определяется смещением по осям Y и Z
PositionEntity C\target,0,C\Y#,C\Z#

End Function
;=========================================================================

У меня вопрос ко всем: как работает команда ResetEntity entity?
(Offline)
 
Ответить с цитированием
Старый 25.11.2005, 17:31   #18
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Resets the collision state of an entity.
Надо полагать - снимает все предустановленные коллизии с этого объекта.
Хотя чем она тогда отличается от
Entitytype entity,0
...
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 25.11.2005, 20:31   #19
alcosholik
 
Сообщений: n/a
Originally posted by impersonalis@Nov 25 2005, 03:31 PM
Хотя чем она тогда отличается от
Entitytype entity,0
Всем.
ResetEntity снимает текущие коллизии с объекта, т.е. проверка на коллизию этого объекта (EntityCollided) возвращает 0.
А EntityType entity,0 присваивает объекту нулевой тип => он больше не будет коллизиться.
 
Ответить с цитированием
Старый 25.11.2005, 20:53   #20
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
короче - очищает список коллизий, составленный последним UpdateWorld`ом.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 25.11.2005, 20:54   #21
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Я это понял, что текущие, до ближайшего АпдэйтВорлда.
Просто не углядел, что тип коллизии ставится не камере, а цели.
Тогда бы вопроса не было.

ПС: колизия = коллизия (не могу никак определиться, 2 буквы Л писать или 1)
(Offline)
 
Ответить с цитированием
Старый 27.11.2005, 21:02   #22
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Вопрос мой закрыт!

Всем спасибо!

Разобрался!

Сделал!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Camera pick! Fatalix3d 3D-программирование 17 01.09.2009 20:26
Camera Match Round Работы 8 19.02.2007 20:23
Camera root 3D-программирование 9 22.05.2006 18:54


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


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