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

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

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

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

Ответ
 
Опции темы
Старый 02.09.2012, 15:02   #1
Keypa
AnyKey`щик
 
Аватар для Keypa
 
Регистрация: 04.12.2010
Адрес: Санкт-Петербург
Сообщений: 14
Написано 4 полезных сообщений
(для 9 пользователей)
Приближение/удаление камеры

Всем привет!
Нужна ваша помощь...
вопрос 1: Как сделать ограничения на приближение/удаление камеры от перса? Оно есть, но очень корявое, наверно)
прокрутка колесиком
вопрос 2: Трабла с ограничением угла обзора по оси Y, если быстро кинуть мышь вверх, камера делает сальто, в чем может быть проблема?
Ссылка на файл
(Offline)
 
Ответить с цитированием
Старый 02.09.2012, 15:11   #2
tirarex
Бывалый
 
Аватар для tirarex
 
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений
(для 866 пользователей)
Ответ: Приближение/удаление камеры

качай варпер физикса или блиц bullet
спасибо скажеш
(Offline)
 
Ответить с цитированием
Старый 02.09.2012, 18:38   #3
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Приближение/удаление камеры

для вращения используй аккумуляцию углов и последующее ограничение Pitch угла, примерно так ( возможно где-то косяк со знаками, не проверял ):
; расчитываем смещение мыши с учетом чувствительности
Local MouseDeltaX# = MouseXSpeed() * MouseSensitivityX
Local MouseDeltaY# = MouseYSpeed() * MouseSensitivityY

; блокируем мышь в центре экрана
MoveMouse( ScreenCenterX, ScreenCenterY )

; аккумулируем угол вращения тела
PlayerBodyYaw = PlayerBodyYaw - MouseDeltaX

; вращаем тело
RotateEntity( PlayerBody, 0, PlayerBodyYaw, 0 )

; аккумулируем угол наклона камеры
PlayerCameraPitch = PlayerCameraPitch - MouseDeltaY

; ограничиваем его
If PlayerCameraPitch < MinPlayerCameraPitch Then PlayerCameraPitch = MinPlayerCameraPitch
If PlayerCameraPitch > MaxPlayerCameraPitch Then PlayerCameraPitch = MaxPlayerCameraPitch

; вращаем пивот камеры
RotateEntity( PlayerCamera, PlayerCameraPitch, 0, 0 )
для движения, как минимум, определение направления и его нормализация ( чтобы по диагонали скорость не была выше ), примерно так:
; вектор направления ( только оси X и Z, если перс не умеет летать :) )
Local PlayerBodyViewingDirX# = GetMatElement( PlayerBody, 2, 0 )
Local PlayerBodyViewingDirZ# = GetMatElement( PlayerBody, 2, 1 )

; вектор движения
Local PlayerBodyMovingDirX# = 0
Local PlayerBodyMovingDirZ# = 0

; вперед ( вектор движения +  вектор направления )
If KeyDown( 17 ) Then
	PlayerBodyMovingDirX = PlayerBodyMovingDirX + PlayerBodyViewingDirX
	PlayerBodyMovingDirZ = PlayerBodyMovingDirZ + PlayerBodyViewingDirZ
End If

; назад ( вектор движения +  -вектор направления )
If KeyDown( 31 ) Then
	PlayerBodyMovingDirX = PlayerBodyMovingDirX - PlayerBodyViewingDirX
	PlayerBodyMovingDirZ = PlayerBodyMovingDirZ - PlayerBodyViewingDirZ
End If

; вправо ( вектор движения +  перпендикуляр к вектору направления )
If KeyDown( 30 ) Then
	PlayerBodyMovingDirX = PlayerBodyMovingDirX + PlayerBodyViewingDirZ
	PlayerBodyMovingDirZ = PlayerBodyMovingDirZ - PlayerBodyViewingDirX
End If

; влево ( вектор движения + -перпендикуляр к вектору направления )
If KeyDown( 32 ) Then
	PlayerBodyMovingDirX = PlayerBodyMovingDirX - PlayerBodyViewingDirZ
	PlayerBodyMovingDirZ = PlayerBodyMovingDirZ + PlayerBodyViewingDirX
End If

; квадрат длины вектора движения
Local PlayerBodyMovingDirDot# = PlayerBodyMovingDirX * PlayerBodyMovingDirX + PlayerBodyMovingDirZ * PlayerBodyMovingDirZ

; если больше единицы, значит движение дагональное, нормализуем
If PlayerBodyMovingDirDot > 1.0 Then
	
	Local PlayerBodyMovingDirInvLen# = 1.0 / Sqr( PlayerBodyMovingDirDot )
	
	PlayerBodyMovingDirX = PlayerBodyMovingDirX * PlayerBodyMovingDirInvLen
	PlayerBodyMovingDirZ = PlayerBodyMovingDirZ * PlayerBodyMovingDirInvLen
	
End If

; двигаем тело по вектору движения
TranslateEntity( PlayerBody, PlayerBodyMoveDirX, 0, PlayerBodyMoveDirZ )
ну и можно потом аккумуляцию скорости, инерцию, трение, гравитацию, прыжок и т.д. таким же образом, манипулируя векторами.

по ограничению приближения - да просто по смене Z мышки считай квадрат дистанции от камеры до ее пивота, и соответственно двигай\не двигай камеру.

по коду косячки
- SetBuffer BackBuffer() для 3д режима делать не нужно ( конечно если ты не менял буфер ) т.к. по умолчанию стоит BackBuffer.
- UpdateWorld логичнее делать перед RenderWorld
- убери Collisions из цикла, CameraClsColor тоже непонятно что там делает
- control да и вообще любые действия над сценой логичнее делать перед UpdateWorld и RenderWorld
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Platon за это полезное сообщение:
St_AnGer (04.09.2012), tirarex (03.09.2012)
Старый 04.09.2012, 10:34   #4
Keypa
AnyKey`щик
 
Аватар для Keypa
 
Регистрация: 04.12.2010
Адрес: Санкт-Петербург
Сообщений: 14
Написано 4 полезных сообщений
(для 9 пользователей)
Ответ: Приближение/удаление камеры

tirarex
качай варпер физикса или блиц bullet
спасибо скажеш
ээммм... а можно поподробнее?

Platon
ну и можно потом аккумуляцию скорости, инерцию, трение, гравитацию, прыжок и т.д.
хм... видимо я еще полный нуб, но чет мне этот код не адаптировать под свой(
А что насчет моего кода, он слишком примитивен или можно с ним работать?
(Offline)
 
Ответить с цитированием
Старый 04.09.2012, 11:14   #5
tirarex
Бывалый
 
Аватар для tirarex
 
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений
(для 866 пользователей)
Ответ: Приближение/удаление камеры

Сообщение от Keypa Посмотреть сообщение
ээммм... а можно поподробнее?
я говорю про внешнии физические движки
PhysX
http://forum.boolean.name/showthread.php?t=7568
быстрый удобный простой
куча примеров там есть ответы на 90 % вопросов
есть хелп на русском
скачаь можно бесплатно ограничение одно - надо сделать надпись о том что в игре юзается физикс

blitz bullet
http://forum.boolean.name/showthread.php?t=14511
по шустрее физикса но
тряпки и машины всё таки медленнее
примеров тоже много есть полноценные с машиной и игроком
по освоению мне показался сложнее
есть хелп на русском и отличный дебаг
триал уж не помню 20 30 минут
хотя кокс сказал что для нормального проекта отдаст даром


оба двига классные но я привык к физиксу
жаль я сразу буллет не увидел

а так выбор за тобой
(Offline)
 
Ответить с цитированием
Старый 04.09.2012, 19:09   #6
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Приближение/удаление камеры

1. примерно так
;====отдаление камеры=====================
km#=MouseZSpeed()*3
og#=MouseZ()
If EntityZ#(cam)>-50 Then MoveEntity cam,0,0,km#
If EntityZ#(cam)<-10 Then MoveEntity cam,0,0,km#
If EntityZ#(cam)<-50 Then PositionEntity(cam,EntityX#(cam),EntityY#(cam),-50)
If EntityZ#(cam)>-10 Then PositionEntity(cam,EntityX#(cam),EntityY#(cam),-10)
2. крутое сальто то
может проще?:
Function control()
;====Sensivity=============================
TurnEntity bolvan,0,-MouseXSpeed()*sens#,0
TurnEntity pivot,MouseYSpeed()*sens#,0,0
MoveMouse (GraphicsWidth()*0.5,GraphicsHeight()*0.5)
V#=60
;If Abs(EntityPitch#(pivot))>V# Then RotateEntity pivot,V#*Sgn(EntityPitch#(pivot)),0,0
If EntityPitch#(pivot)>V# Then RotateEntity pivot,V#,EntityYaw#(pivot),EntityRoll#(pivot)
If EntityPitch#(pivot)<-V# Then RotateEntity pivot,-V#,EntityYaw#(pivot),EntityRoll#(pivot)
If Abs(EntityPitch#(pivot))>V# Then RotateEntity pivot,V#*Sgn(EntityPitch#(pivot)),EntityYaw#(pivot ),EntityRoll#(pivot)
вот это камеру то заносит...

в функцию stat или выводи на монитор лучше Text 10, 20, EntityPitch#(pivot) и прочее, чем пока TrisRendered()
(Offline)
 
Ответить с цитированием
Старый 04.09.2012, 20:21   #7
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: Приближение/удаление камеры

2. крутое сальто то
может проще?:
может еще проще?

2. http://forum.boolean.name/showthread.php?t=16959
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (05.09.2012)
Старый 05.09.2012, 23:11   #8
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Приближение/удаление камеры

Сообщение от mr.DIMAS Посмотреть сообщение
может еще проще?

2. http://forum.boolean.name/showthread.php?t=16959
сначала хотел написать: "может тупо так?". Но вдруг слово "тупо" не так поймут.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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