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

ken park 17.06.2009 12:52

Камера...
 
Очень прошу Вашеи помощи. Как мне сделать камеру от третьего лица... Приведу тупые примеры, но как в Gta, Hitman и тому подобные игры. И... Что бы она была "привязана" к спине персонажа... Офигенно бы было если бы камеру можно было крутить вокруг оси персонажа. Вот то что уже есть, если сможете, вставте код за меня, пожалуиста ^^:

Код:

Graphics3D 640,480
 
cam = CreateCamera()
PositionEntity cam, 0, 30, -20
RotateEntity cam, 30, 0, 0
l = CreateLight()
RotateEntity l, 0, 45, 45
 
ground = CreatePlane()
PositionEntity ground, 0, -8, 0
grass = LoadTexture("D:\psychodrama\1.jpg")
ScaleTexture grass, 50, 50
EntityTexture ground, grass
 
robot = LoadMesh("D:\psychodrama\Shadow.3ds")
ScaleEntity robot, 0.4, 0.4, 0.4
rx#=10
rz#=0
ang=90
Repeat
PositionEntity robot, rx#, -8, rz#
RotateEntity robot, 0, ang + 90, 0
PointEntity cam, robot
If KeyDown(200) Then
  rx# = rx# + Cos(ang) * 0.5
  rz# = rz# + Sin(ang) * 0.5
 End If
If KeyDown(203) Then ang = ang + 5
If KeyDown(205) Then ang = ang - 5
 
If KeyDown(1) Then Exit
 
RenderWorld
Flip
Forever


Sleepybear 17.06.2009 13:04

Ответ: Камера...
 
Код:

Graphics3D 800,600,32,0

User=CreateSphere()
Pivot=CreatePivot(User)
PositionEntity pivot,0,5,-10
Camera=CreateCamera()

ground=CreateCube()
PositionEntity ground,0,-10,0
ScaleEntity ground,50,.1,50
EntityColor ground,0,128,64

While Not KeyDown(1)

        curX#=EntityX(Camera, True)
        curY#=EntityY(Camera, True)
        curZ#=EntityZ(Camera, True)
        destX#=EntityX(Pivot,True)
        destY#=EntityY(Pivot,True)
        destZ#=EntityZ(Pivot,True)
        CamX#=((destX#-curX#)/10)
        CamY#=((destY#-curY#)/10)
        CamZ#=((destZ#-curZ#)/10)
        TranslateEntity Camera,CamX,CamY,CamZ
        PointEntity camera,User
       
    RenderWorld
    UpdateWorld
       
Flip False :Wend:End

Вставиш сам, Я не бумаю что тут кто то за тебя делать будет. :)


Насчет крутить камеру вокруг это просто
Крути pivot

ken park 17.06.2009 13:10

Ответ: Камера...
 
о! и на этом огромное спасибо ) можешь про pivot пояснить ?

ken park 17.06.2009 13:18

Ответ: Камера...
 
так... хм... я вставил модель, но камера показывается с лица персонажа. и никак не смог сделать движение, стоит на месте и всё...
Код:

Graphics3D 800,600,32,0

User=LoadMesh("D:\psychodrama\Shadow.3ds")
ScaleEntity user, 0.50, 0.50, 0.50
rx#=10
rz#=0
ang=90
Repeat
PositionEntity user, rx#, -8, rz#
RotateEntity user, 0, ang + 90, 0

If KeyDown(200) Then
  rx# = rx# + Cos(ang) * 0.5
  rz# = rz# + Sin(ang) * 0.5
 End If
If KeyDown(203) Then ang = ang + 5
If KeyDown(205) Then ang = ang - 5

Pivot=CreatePivot(User)
PositionEntity pivot,0,5,-300
Camera=CreateCamera()

ground = CreatePlane()
PositionEntity ground, 0, -8, 0
grass = LoadTexture("D:\psychodrama\1.jpg")
ScaleTexture grass, 50, 50
EntityTexture ground, grass

While Not KeyDown(1)

        curX#=EntityX(Camera, True)
        curY#=EntityY(Camera, True)
        curZ#=EntityZ(Camera, True)
        destX#=EntityX(Pivot,True)
        destY#=EntityY(Pivot,True)
        destZ#=EntityZ(Pivot,True)
        CamX#=((destX#-curX#)/10)
        CamY#=((destY#-curY#)/10)
        CamZ#=((destZ#-curZ#)/10)
        TranslateEntity Camera,CamX,CamY,CamZ
        PointEntity camera,User
       
    RenderWorld
    UpdateWorld
       
Flip False :Wend:End
Forever


Sleepybear 17.06.2009 13:24

Ответ: Камера...
 
Ты немного не с того начал

Pivot не видимая точка с которой ты можеш работать как с обьектом

Pivot=CreatePivot(User)
создаеш и привязываеш пивот к герою
PositionEntity pivot,0,5,-300
ставиш пивот неподалеку от геороя поскольку он привязан он всегда будет на этом растаянии



curX#=EntityX(Camera, True)
curY#=EntityY(Camera, True)
curZ#=EntityZ(Camera, True)
destX#=EntityX(Pivot,True)
destY#=EntityY(Pivot,True)
destZ#=EntityZ(Pivot,True)
CamX#=((destX#-curX#)/10)
CamY#=((destY#-curY#)/10)
CamZ#=((destZ#-curZ#)/10)
TranslateEntity Camera,CamX,CamY,CamZ
двигаеш камеру за пивотом

PointEntity camera,User
заставляеш камерувсегда смотреть на пивот


Стоит на место пото му что
If KeyDown(200) Then
должно находится в цикле

Repeat...... forever

или

While...... Wend

пивот стоит с лица героя поэтому и камера так смотрит



ps: ух как :)

ken park 17.06.2009 13:31

Ответ: Камера...
 
спасибо большое) вот только никак немогу вычислить чтобы со спины вид был, а у моделька полубоком к камере )
всё, задом поставил ))

Sleepybear 17.06.2009 13:36

Ответ: Камера...
 
Цитата:

Сообщение от ken park (Сообщение 107868)
спасибо большое) вот только никак немогу вычислить чтобы со спины вид был, а у моделька полубоком к камере )

поиграйся с параменрами пивота
тут --> positionentity pivot ,0,0,0

ken park 17.06.2009 13:37

Ответ: Камера...
 
с этим и игрался ) так, буду дальше твое сообщение изучать )

Sleepybear 17.06.2009 13:40

Ответ: Камера...
 
help читай там больше инфы чем в моем сообщении :)

ken park 17.06.2009 13:43

Ответ: Камера...
 
у меня в конце вот так получается, но не работает, потому что не понял как вставлять While, Wend.. и тд
Код:

        ScaleEntity user, 0.50, 0.50, 0.50
rx#=10
rz#=0
ang=90
Repeat
PositionEntity user, rx#, -8, rz#
RotateEntity user, 0, ang + 90, 0

If KeyDown(200) Then
  rx# = rx# + Cos(ang) * 0.5
  rz# = rz# + Sin(ang) * 0.5
 End If
If KeyDown(203) Then ang = ang + 5
If KeyDown(205) Then ang = ang - 5
       
    RenderWorld
    UpdateWorld
       
Flip False
End
Forever


Sleepybear 17.06.2009 13:54

Ответ: Камера...
 
Цикл REPEAT ... UNTIL позволяет Вам выполнять серию команд, пока определенное условие не будет соблюдено. Это позволяет проверять условие ПОСЛЕ каждого цикла, а не ДО, как в цикле WHILE ... WEND. В общем, используйте REPEAT ... UNTIL, если Вы уверены, что помещаете в цикл команды, которые должны быть использованы минимум 1 раз.

Код:

; Повторять до нажатия клавиши ESC

Repeat
print "Нажмите ESC для выхода!"
Until KeyHit(1)

Цикл WHILE/WEND используется, когда Вы хотите запустить серию команд несколько раз, опираясь на соблюдение или несоблюдение условия. Он работает подобно циклу REPEAT/UNTIL, за исключением проверки условия в начале цикла, вместо ее проверки в конце. Обычно Вы будете использовать WHILE/WEND, когда не будете уверенны, сколько раз Вам понадобится выполнение команд, находящихся в цикле, а кроме того, Вы вообще можете остановить цикл до запуска любых команд. Если Вам нужно запустить команды в цикле лишь однажды перед соблюдение условия, используйте REPEAT/UNTIL.

Код:

; While/Wend Пример

; Условие цикла находится на ВЕРШИНЕ цикла
While Not KeyHit(1) ; Так долго, пока юзер не нажмет ESC ...
Print "Нажмите Esc, что бы закончить этот бардак!" ; Вывести это на экран
Wend ; Вернуться к началу цикла WHILE


ЧИТАЙ HELP внимательно!!! до полного осмысления!

ken park 17.06.2009 14:02

Ответ: Камера...
 
ну оочень прошу, проделаите с этим ^___^ :
Код:

ScaleEntity user, 0.50, 0.50, 0.50
rx#=10
rz#=0
ang=90
Repeat
PositionEntity user, rx#, -8, rz#
RotateEntity user, 0, ang + 90, 0

If KeyDown(200) Then
  rx# = rx# + Cos(ang) * 0.5
  rz# = rz# + Sin(ang) * 0.5
 End If
If KeyDown(203) Then ang = ang + 5
If KeyDown(205) Then ang = ang - 5


NitE 17.06.2009 14:04

Ответ: Камера...
 
дай полный код - помогу

ken park 17.06.2009 14:05

Ответ: Камера...
 
Код:

Graphics3D 800,600,32,1

User=LoadMesh("D:\psychodrama\Shadow.3ds")

        ScaleEntity user, 0.50, 0.50, 0.50
rx#=10
rz#=0
ang=90
Repeat
PositionEntity user, rx#, -8, rz#
RotateEntity user, 0, ang + 90, 0

If KeyDown(200) Then
  rx# = rx# + Cos(ang) * 0.5
  rz# = rz# + Sin(ang) * 0.5
 End If
If KeyDown(203) Then ang = ang + 5
If KeyDown(205) Then ang = ang - 5
       
    RenderWorld
    UpdateWorld

Pivot=CreatePivot(User)
PositionEntity pivot, 0, 170, 270
camera=CreateCamera()

ground = CreatePlane()
PositionEntity ground, 0, -8, 0
grass = LoadTexture("D:\psychodrama\1.jpg")
ScaleTexture grass, 50, 50
EntityTexture ground, grass

While Not KeyDown(1)

        curX#=EntityX(Camera, True)
        curY#=EntityY(Camera, True)
        curZ#=EntityZ(Camera, True)
        destX#=EntityX(Pivot,True)
        destY#=EntityY(Pivot,True)
        destZ#=EntityZ(Pivot,True)
        CamX#=((destX#-curX#)/10)
        CamY#=((destY#-curY#)/10)
        CamZ#=((destZ#-curZ#)/10)
        TranslateEntity Camera,CamX,CamY,CamZ
        PointEntity camera,User

    RenderWorld
    UpdateWorld

Flip False :Wend:End
Forever


NitE 17.06.2009 14:07

Ответ: Камера...
 
ну и модель тоже ё-маё, без неё не работает


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

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