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

Gnom 10.03.2006 00:05

код
Код:

;============================================

DefScreenSizeX        =800
DefScreenSizeY=600
DefScreenColorMode=32

Graphics3D DefScreenSizeX, DefScreenSizeY, DefScreenColorMode, 0
SetBuffer BackBuffer()

;============================================

Global player
Global camera
Global camPivot
Global camDest# = 24

;============================================

Function SpawnPlayer()
        px# =0
        py# =0
        pz# =0
       
        player = LoadAnimMesh ("data\models\tmp.b3d")
        camPivot=CreateCamera(player)
        camera=CreateCamera(camPivot)
        PositionEntity player, px#, py#, pz#
        PositionEntity camera, 0, camDest#, camDest# *-1
       
End Function

Function GroundPlane();test

ground = CreatePlane()
PositionEntity ground, 0, 0, 0
grass = LoadTexture("data\textures\ground01.tga")
ScaleTexture grass, 10, 10
EntityTexture ground, grass

End Function

Function PlayerControl()
V#=0.5
u#=0
camDest# =camDest# - MouseZSpeed()

        If camDest# <4 Then camDest# =16
 If camDest# >64 Then camDest# =32

TurnEntity camPivot, MouseYSpeed(),0,0
TurnEntity camPivot, 0,-MouseXSpeed(),0

        If KeyDown(200) Then MoveEntity player, 0, 0, 1       
        If KeyDown(208) Then MoveEntity player, 0, 0, -1

 If KeyDown(203) Then TurnEntity player, 0, 5, 0
        If KeyDown (205) Then TurnEntity player, 0, -5, 0
       
MoveMouse GraphicsWidth()*0.5, GraphicsHeight()*0.5

PositionEntity camera, 0, camDest# , camDest# *-1
PointEntity camera, player

End Function

;============================================

GroundPlane()
SpawnPlayer()

;============================================
While Not KeyHit(1)=1
PlayerControl()
RenderWorld()
Print EntityPitch#(camPivot)
Print EntityYaw#(camPivot)
Print EntityRoll#(camPivot)
Flip
Wend
End

Проблема:
камера должна вращаться вокруг игрока- она это делает, но при определенном повороте по одной из осей начинается непредсказуемое вращение....
Пробовал ставить ограничения разные на угол поворота- получается резкий скачек при вращении камерой- не красиво.
Подскажите, пожалуста, как сделать нормальное вращение камеры вокруг игрока?

jimon 10.03.2006 00:14

думаю тебе поможет команда entityparent

tormoz 10.03.2006 00:31

Меняй управление камерой.
Например на такое:

Код:

mxs# = MouseXSpeed()/pop
 *mys# = MouseYSpeed()/pop
If mys>4 mys=4
If mys<-4 mys=-4
 *
 *dest_xang# = dest_xang + mys
 *dest_yang# = dest_yang - mxs
       
 *xang# = CurveValue (xang, dest_xang, 10)
 *yang# = CurveValue (yang, dest_yang, 10)
 * * * * * *
 * * *If xang>80 xang=80:dest_xang=80
 If xang<-80 xang=-80:dest_xang=-80 * * * * *
 * * * MoveMouse xcur,ycur
RotateEntity cam,xang,yang,0


Function CurveValue#(current#,destination#,curve)
        current#=current#+((destination#-current#)/curve)
        Return current#
End Function

Ну естественно приспособь для своей специфики. Так как выдаются переменные на управление камерой, то очень легко их ограничивать и тд.
"Резиновость" камеры последний аргумент в функции CurveValue

Gnom 10.03.2006 00:31

не очень хорошо понимаю, чем она мне поможет, если честно...
она вроде как прикреплялка работает, не?
у меня проблема скорее с ограничениями по осям- из-за алгоритмов, которые я использую при вращении камеры происходит типа "перекручивания", после которого движение камеры уже идет не как задуманно...

Gnom 11.03.2006 00:05

Спасиб. за советы, но я сделал свой хак уже)
Код:


camDest# =camDest# - MouseZSpeed()
camHel# =camHel# + MouseYSpeed()

        If camDest# <16 Then camDest# =16
        If camDest# >64 Then camDest# =64
        If camHel# <1 Then camHel# =1
        If camHel# >63 Then camHel# =63

camPos# = Sqr ((camDest# *camDest#)-(camHel# * camHel#))

        If KeyDown(200) Then MoveEntity player, 0, 0, 1       
        If KeyDown(208) Then MoveEntity player, 0, 0, -1

 If KeyDown(203) Then TurnEntity player, 0, 5, 0
        If KeyDown (205) Then TurnEntity player, 0, -5, 0
       
MoveMouse GraphicsWidth()*0.5, GraphicsHeight()*0.5

TurnEntity camPivot, 0, -MouseXSpeed(), 0
PositionEntity camera, 0, camHel#, camPos# *-1
PointEntity camera, player

Через теорему Пифагора......)))

SBJoker 11.03.2006 01:05

Меня умиляют эти посты...TurnEntity вообщето для поворота вокруг СОБСТВЕННОЙ оси... что это значит? Это значит, что поворачиваясь вокруг собственной оси например Z вы поворачиваете и две остальные оси, и как результат "непредвиденное" или "глючное" поведение камеры... Если вам нужны глобальные повороты юзайте RotateEntity, или TurnEntity относительно родителя...

в хелпе всё есть..хотя и довольно сжато..

Gnom 11.03.2006 11:16

Цитата:

Originally posted by SBJoker@11.3.2006, 1:05
Меня умиляют эти посты...TurnEntity вообщето для поворота вокруг СОБСТВЕННОЙ оси... что это значит? Это значит, что поворачиваясь вокруг собственной оси например Z вы поворачиваете и две остальные оси, и как результат "непредвиденное" или "глючное" поведение камеры... Если вам нужны глобальные повороты юзайте RotateEntity, или TurnEntity относительно родителя...

в хелпе всё есть..хотя и довольно сжато..

Жалко, ты не вразумил меня немного раньше...)


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

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