|
3D-программирование Вопросы, касающиеся программирования 3D мира |
02.09.2012, 15:02
|
#1
|
AnyKey`щик
Регистрация: 04.12.2010
Адрес: Санкт-Петербург
Сообщений: 14
Написано 4 полезных сообщений (для 9 пользователей)
|
Приближение/удаление камеры
Всем привет!
Нужна ваша помощь...
вопрос 1: Как сделать ограничения на приближение/удаление камеры от перса? Оно есть, но очень корявое, наверно)
прокрутка колесиком
вопрос 2: Трабла с ограничением угла обзора по оси Y, если быстро кинуть мышь вверх, камера делает сальто, в чем может быть проблема?
Ссылка на файл
|
(Offline)
|
|
02.09.2012, 15:11
|
#2
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Приближение/удаление камеры
качай варпер физикса или блиц bullet
спасибо скажеш
|
(Offline)
|
|
02.09.2012, 18:38
|
#3
|
Знающий
Регистрация: 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 за это полезное сообщение:
|
|
04.09.2012, 10:34
|
#4
|
AnyKey`щик
Регистрация: 04.12.2010
Адрес: Санкт-Петербург
Сообщений: 14
Написано 4 полезных сообщений (для 9 пользователей)
|
Ответ: Приближение/удаление камеры
tirarex
качай варпер физикса или блиц bullet
спасибо скажеш
|
ээммм... а можно поподробнее?
Platon
ну и можно потом аккумуляцию скорости, инерцию, трение, гравитацию, прыжок и т.д.
|
хм... видимо я еще полный нуб, но чет мне этот код не адаптировать под свой(
А что насчет моего кода, он слишком примитивен или можно с ним работать?
|
(Offline)
|
|
04.09.2012, 11:14
|
#5
|
Бывалый
Регистрация: 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
|
Мастер
Регистрация: 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
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: Приближение/удаление камеры
2. крутое сальто то
может проще?:
|
может еще проще?
2. http://forum.boolean.name/showthread.php?t=16959
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.09.2012, 23:11
|
#8
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Приближение/удаление камеры
Сообщение от mr.DIMAS
|
сначала хотел написать: "может тупо так?". Но вдруг слово "тупо" не так поймут.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:50.
|