forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Приближение/удаление камеры (http://forum.boolean.name/showthread.php?t=17259)

Keypa 02.09.2012 15:02

Приближение/удаление камеры
 
Всем привет!
Нужна ваша помощь...
вопрос 1: Как сделать ограничения на приближение/удаление камеры от перса? Оно есть, но очень корявое, наверно)
прокрутка колесиком
вопрос 2: Трабла с ограничением угла обзора по оси Y, если быстро кинуть мышь вверх, камера делает сальто, в чем может быть проблема?
Ссылка на файл

tirarex 02.09.2012 15:11

Ответ: Приближение/удаление камеры
 
качай варпер физикса или блиц bullet
спасибо скажеш

Platon 02.09.2012 18:38

Ответ: Приближение/удаление камеры
 
для вращения используй аккумуляцию углов и последующее ограничение 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

Keypa 04.09.2012 10:34

Ответ: Приближение/удаление камеры
 
Цитата:

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

Цитата:

Platon
ну и можно потом аккумуляцию скорости, инерцию, трение, гравитацию, прыжок и т.д.
хм... видимо я еще полный нуб, но чет мне этот код не адаптировать под свой(
А что насчет моего кода, он слишком примитивен или можно с ним работать? :dontknow:

tirarex 04.09.2012 11:14

Ответ: Приближение/удаление камеры
 
Цитата:

Сообщение от Keypa (Сообщение 237832)
ээммм... а можно поподробнее?

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

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


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

а так выбор за тобой

LLI.T.A.L.K.E.R. 04.09.2012 19:09

Ответ: Приближение/удаление камеры
 
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()

mr.DIMAS 04.09.2012 20:21

Ответ: Приближение/удаление камеры
 
Цитата:

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

2. http://forum.boolean.name/showthread.php?t=16959

LLI.T.A.L.K.E.R. 05.09.2012 23:11

Ответ: Приближение/удаление камеры
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 237867)
может еще проще?

2. http://forum.boolean.name/showthread.php?t=16959

сначала хотел написать: "может тупо так?". Но вдруг слово "тупо" не так поймут.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot