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=11818)

Raiter 30.01.2010 23:38

Поведение камеры
 
Здравстуйте. Итак возник вопрос с поведением камеры.

Суть такова. Режим 3Д, вид сбоку. Нужно что бы камера вела себя следующим образом: просто двигалась за курсором на небольшое расстояние по Х и Y. Вродь всё просто, но что-то у меня мозг не соображает толком.

Сделал так:

Код:

;создание камеры
Player\Entity = CreatePivot()
Player\CamPivot = CreatePivot(Player\Entity)
PositionEntity Player\CamPivot,0,50,0
Camera = CreateCamera(Player\CamPivot)
PositionEntity Camera,0,0,-200
TurnEntity Camera,10,0,0

;обновление камеры

        If ( MouseY() > 400 ) And  ( EntityY(Camera) > -100 ) Then
                If EntityY(Camera) > -(MouseY() - 400) Then
                        MoveEntity Camera,0,-CamSpeed,0
                End If       
        End If


        If ( MouseY() < 200 ) And  ( EntityY(Camera) < 100 ) Then
                If EntityY(Camera) < -(MouseY() - 200) Then       
                        MoveEntity Camera,0,CamSpeed,0
                End If
        End If

        If EntityY(Camera) < 0 Then
                If EntityY(Camera) < -(MouseY() - 400) Then
                        MoveEntity Camera,0,CamSpeed,0
                End If
        End If

        If EntityY(Camera) > 0
                If EntityY(Camera) > -(MouseY() - 200) Then       
                        MoveEntity Camera,0,-CamSpeed,0
                End If
        End If       




        If ( MouseX() > 600 ) And  ( EntityX(Camera) < 100 ) Then
                If EntityX(Camera) < (MouseX() - 600) Then
                        MoveEntity Camera,CamSpeed ,0,0
                End If       
        End If

        If ( MouseX() < 200 ) And  ( EntityX(Camera) > -100 ) Then
                If EntityX(Camera) > (MouseX() - 200) Then
                        MoveEntity Camera,-CamSpeed ,0,0
                End If       
        End If

        If EntityX(Camera) > 0 Then
                If EntityX(Camera) > (MouseX() - 600) Then
                        MoveEntity Camera,-CamSpeed ,0,0
                End If
        End If

        If EntityX(Camera) < 0
                If EntityX(Camera) < (MouseX() - 200) Then
                        MoveEntity Camera,CamSpeed ,0,0
                End If
        End If

Но работает это не совсем корректно. Тоесть камера перемещается не настолько плавно как хотелось бы...

Подскажите способ реализации такой камеры...

ABTOMAT 31.01.2010 03:07

Ответ: Поведение камеры
 
MX% = MouseX()
MY% = MouseY()
dt% = 14

CX# = (MX-GraphicsWidth()*0.5)/Float(GraphicsWidth())*1
CY# = (MY-GraphicsHeight()*0.5)/Float(GraphicsHeight())*-1
MoveEntity Cam,(CX-EntityX(cam))*0.003*dt,(CY-EntityY(cam))*0.003*dt,0

как-то так.

3д-шное меню, ведёшь курсор в сторону - и камера за ним, и по мере приближения замедляется
работает отлично
коэффициенты подгонять методом научного тыка

И да, код из первого поста огорчает

Reizel 31.01.2010 10:17

Ответ: Поведение камеры
 
Немного доработав пример сделал такую хрень:
Код:

;создание камеры
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
Type Player
Field Entity
Field CamPivot
End Type

Const CamSpeed#=.1
For K=1 To 300
        C=CreateCube()
        PositionEntity C,Rand(-100,100),Rand(-100,100),Rand(-100,100)
Next
Player.Player=New Player
Player\Entity = CreatePivot()
Player\CamPivot = CreatePivot(Player\Entity)
PositionEntity Player\CamPivot,0,50,0
Camera = CreateCamera(Player\CamPivot)
PositionEntity Camera,0,0,-200
TurnEntity Camera,10,0,0
Repeat
RenderWorld
;обновление камеры
aX#=aX#*.97
aY#=aY#*.97
aY#=aY#-MouseYSpeed()*.01
aX#=aX#+MouseXSpeed()*.01

TranslateEntity Camera,aX#,aY#,0
MoveMouse 100,100
       
Flip
Until KeyHit(1)
End


Raiter 31.01.2010 14:04

Ответ: Поведение камеры
 
Цитата:

Сообщение от ABTOMAT (Сообщение 135432)
И да, код из первого поста огорчает

Да я знаю, что код черезжопный. Мозг не работал вообще.

Павел
Спасибо, но это не совсем то....

Мне нужно что бы курсор (прицел) спокойно перемещался по экрану, а камера перемещалась за ним, если он отдалился на некоторое расстояние от игрока...

Как бы камера должна доганять прицел. Тоесть так, как у меня в примере, но нужно что бы это работало плавно....

impersonalis 01.02.2010 03:35

Ответ: Поведение камеры
 
Цитата:

работало плавно
Требуется добавить плавный разгон и торможение?
Не сочтите занудой, но
http://ru.wikipedia.org/wiki/Апериодическое_звено
диф.ур реушается простейшим
http://ru.wikipedia.org/wiki/Метод_Эйлера

И да - все попытки реализовать иначе, будут лишь частным случаем; более громоздким и менее универсальным.

Raiter 01.02.2010 19:46

Ответ: Поведение камеры
 
Всем спасибо за помощь, особенно АВТОМАТу

Dream 01.02.2010 20:20

Ответ: Поведение камеры
 
2imper зануда xD


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

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