forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Camera (http://forum.boolean.name/showthread.php?t=317)

Fant 12.11.2005 10:20

Никак не получается сделать 5 видов камер. Срочно нужна помощь

Нужен:

1) вид от 1 лица (как в практически любом action)
2) следящая камера (то есть камера сзади следит за игроком, как в 3d РГП, например), возможно двигать камеру ближе или дальше от игрока, выше или ниже(относительно игрока)
3) вид сверху ( с возможностью двигать камеру выше или ниже); при приближении камера следит за игроком.
4) так, что бы камеру можно было "оставить" на любом месте, и он следила за игроком(pointentity)
5) любая позиция камеры, настроенная игроком (к примеру с помощью мыши и клавы, потом эта настроенная камера следит за игроком) (к примеру удерживаем правую кнопу мыши и двигаем мышью, настраиваю позицию камеры выше лии ниже(вверх/вниз), ближе или дальше (вперед/назад), кнопки клавы (опционально) двигают камеру левее или правее относительно игрока.

Очень прошу помочь.
Это очень важно сделать!
Прилагаю пример. Xfighter., нам в принципе все это есть, но сложновато, что я не смог разобраться.


Код:

Global rcx#
Global rcy#
Global rcz#
Global pcx#
Global pcy#
Global pcz#

Graphics3D 800,600,32,2
SetBuffer BackBuffer()


Const typeplayer=1
Const typescene=2
Const typecamera=3


scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;------------------------------------------------;
RotateEntity camera,rcx#,rcy#,rcz#; - НАСТРОЙКИ
PositionEntity camera,pcx#,pcy#,pcz#; -НАСТРОЙКИ
PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityRadius camera,5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3


Repeat

TranslateEntity player,0,-1,0


If KeyDown(75) TurnEntity camera,0,1,0
If KeyDown(77) TurnEntity camera,0,-1,0
If KeyDown(72) TurnEntity camera,1,0,0
If KeyDown(80) TurnEntity camera,-1,0,0
If KeyDown(71) MoveEntity camera,0,0,1
If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,1
If KeyDown(208) MoveEntity player,0,0,-1
If KeyDown(203)TurnEntity player,0,5,0
If KeyDown(205) TurnEntity player,0,-5,0


If KeyDown(2)
camerasrate=1
End If

If KeyDown(3)
camerasrate=2
End If

If KeyDown(4)
camerasrate=3
End If

If KeyDown(5)
camerasrate=4
End If

If KeyDown(6)
camerasrate=5
End If

Select camerasrate


;КАМЕРА++++++++++++++++++++++++++++++++++++++++++
Case 1
End

Case 2
End

Case 3
End

Case 4
End

Case 5
End

End Select
;КАМЕРА++++++++++++++++++++++++++++++++++++++++++

;муть;
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


jimon 12.11.2005 16:02

писать код влень, обясню как делать:
1) ставиш камеру на позицию игрока и парентиш ее к игроку
2) ставиш камеру на позицию игрока, moveentity cam,0,0,-10 и парентиш ее к игроку
3) создаеш пивот, ставиш его на позицию игрока, парентиш пиво к игроку ,ставиш камеру на позицию игрока, moveentity cam,0,height,0 ; парентиш камеру к пивоту
пивот НЕ ПОВОРАЧИВАЕШ ПРИ ДВИЖЕНИИ МЫШКИ

4) ставиш камеру где надо, и в цыкле делает pointentity ...

5) геморно, думать нестал :)


если непонял - спроси что непонял

Fant 12.11.2005 20:44

Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()


Const typeplayer=1
Const typescene=2
Const typecamera=3


scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;------------------------------------------------;

PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityRadius camera,5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3


Repeat

TranslateEntity player,0,-1,0


If KeyDown(75) TurnEntity camera,0,1,0
If KeyDown(77) TurnEntity camera,0,-1,0
If KeyDown(72) TurnEntity camera,1,0,0
If KeyDown(80) TurnEntity camera,-1,0,0
If KeyDown(71) MoveEntity camera,0,0,1
If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,1
If KeyDown(208) MoveEntity player,0,0,-1
If KeyDown(203)TurnEntity player,0,5,0
If KeyDown(205) TurnEntity player,0,-5,0


If KeyDown(2)
camerasrate=1
End If

If KeyDown(3)
camerasrate=2
End If

If KeyDown(4)
camerasrate=3
End If

If KeyDown(5)
camerasrate=4
End If

If KeyDown(6)
camerasrate=5
End If

Select camerasrate


;КАМЕРА++++++++++++++++++++++++++++++++++++++++++
Case 1
PositionEntity camera,EntityX(player),EntityY(player),EntityZ(player)
EntityParent camera, player

Case 2
End

Case 3
End

Case 4
End

Case 5
End

End Select
;КАМЕРА++++++++++++++++++++++++++++++++++++++++++

;муть;
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End

сдела, и не вышло! Камера совсем не там, где надо!

jimon 12.11.2005 21:16

'чем отличается новичок от профи ?
тем что профи думает перед тем как напостить о проблемме'

ps. идинтсвеное место где я тебе сказал писать команду в цыкл ето 4 вид камеры

Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

Global camera
Global player

Const typeplayer=1
Const typescene=2
Const typecamera=3


scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;------------------------------------------------;

PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityRadius camera,5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3



Repeat

TranslateEntity player,0,-1,0


If KeyDown(75) TurnEntity camera,0,1,0
If KeyDown(77) TurnEntity camera,0,-1,0
If KeyDown(72) TurnEntity camera,1,0,0
If KeyDown(80) TurnEntity camera,-1,0,0
If KeyDown(71) MoveEntity camera,0,0,1
If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,1
If KeyDown(208) MoveEntity player,0,0,-1
If KeyDown(203)TurnEntity player,0,5,0
If KeyDown(205) TurnEntity player,0,-5,0


If KeyHit(2) Then set_cam(1)
If KeyHit(3) Then set_cam(2)
If KeyHit(4) Then set_cam(3)
If KeyHit(5) Then set_cam(4)
If KeyHit(6) Then set_cam(5)


;ìóòü;
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Function set_cam(camerasrate)
Select camerasrate

;ÊÀÌÅÐÀ++++++++++++++++++++++++++++++++++++++++++
Case 1
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1)
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1)
EntityParent camera, player,1

Case 2
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1)
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1)
MoveEntity camera,0,0,-10
EntityParent camera, player,1

Case 3
End

Case 4
End

Case 5
End

End Select
End Function


думаю дальше уже сам поймеш

Fant 12.11.2005 21:25

К сожалению не работает.

Я включаю 1 вид и все путем, второй вид - и тоже пашет.

Но если я включаю сначала первый вид, а потом переключаю на второй, то получается та же муть, что и у меня. Камера где то ... но только не там, где надо(

impersonalis 12.11.2005 21:51

Почему бы не использовать несколько камер - имхо, проще.
ТОлько projmode соответствующй им ставить.

Fant 12.11.2005 21:53

Проще, но я не знаю, как это сделать!

Подскажете пожалуйста! Можно по-любому сделать! Полно вариантов! Но я, к сожалению не совсем знаю, как сделать

jimon 12.11.2005 21:54

Код:

Case 2
EntityParent camera, player,0
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1)
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1)
MoveEntity camera,0,0,-10
EntityParent camera, player,1


Fant 13.11.2005 11:06

К сожалению как все не работало, так и не работает.

Второй вид камеры вообще не там. Камера просто не видит игрока. К сожалению.

Так что, я не знаю что делать, но нужна ваша помощь.

Вопрос остается открытым

jimon 13.11.2005 14:20

Код:

Case 1
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1),1
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1),1
EntityParent camera, player,1

Case 2
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1),1
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1),1
MoveEntity camera,0,0,-10
EntityParent camera, player,1

коментарии :



я попросил бы!

Fant 13.11.2005 15:36

Спасибо! Работает!

А к чему комментраий? "я попросил бы!"
не совсем тебя понял!

alex-mad 13.11.2005 16:06

это impersonalis правил сообщение

impersonalis 13.11.2005 17:13

Цитата:

Originally posted by alex-mad@Nov 13 2005, 03:06 PM
это impersonalis правил сообщение
АГА :down:

jimon 13.11.2005 23:17

impersonalis - а че ты правду скрываеш ?

Fant 23.11.2005 21:53

Наконец-то выбрался из череды учений и вернулся к блицу!

Реально.

А у меня есть вопрос по камере!
Как настраивать я уже благодаря jimon понял!

1) Как сделать так, что бы камера плавно поворачивалась за игроком (как в примере driver или x-fighter). К сожалению примера driver нет, а xfigter слишком сложный

2) Как заставить камеру при переключении от одного вида (1,2 кнопки на клаве) плавно переходила в другой вид, а не "прыгала"

Очень прошу помочь!

Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

Global camera
Global player

Const typeplayer=1
Const typescene=2
Const typecamera=3


scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;------------------------------------------------;

PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3




Repeat

TranslateEntity player,0,-1,0


If KeyDown(75) TurnEntity camera,0,1,0
If KeyDown(77) TurnEntity camera,0,-1,0
If KeyDown(72) TurnEntity camera,1,0,0
If KeyDown(80) TurnEntity camera,-1,0,0
If KeyDown(71) MoveEntity camera,0,0,1
If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,1
If KeyDown(208) MoveEntity player,0,0,-1
If KeyDown(203)TurnEntity player,0,5,0
If KeyDown(205) TurnEntity player,0,-5,0


If KeyHit(2) Then set_cam(1)
If KeyHit(3) Then set_cam(2)
If KeyHit(4) Then set_cam(3)
If KeyHit(5) Then set_cam(4)
If KeyHit(6) Then set_cam(5)


;ioou;
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Function set_cam(camerasrate)
Select camerasrate

;EAIA?A++++++++++++++++++++++++++++++++++++++++++
Case 1
PositionEntity camera,EntityX(player,1),EntityY(player,1),EntityZ(player,1),1
RotateEntity camera,EntityPitch(player,1),EntityYaw(player,1),EntityRoll(player,1),1
EntityParent camera, player,1

Case 2
PositionEntity camera,EntityX(player,1),EntityY(player,1)+5,EntityZ(player,1),1
RotateEntity camera,EntityPitch(player,1)+45,EntityYaw(player,1),EntityRoll(player,1),1
MoveEntity camera,0,0,-10
EntityParent camera, player,1



Case 3
End

Case 4
End

Case 5
End

End Select
End Function


Жека 25.11.2005 12:01

Для плавности надо сделать камере какую-то скорость поворота и скорость движения.

Псевдокод такой:
================================================== ===============
ЕСЛИ модуль (Abs) угола между игроком и камерой (DeltaYaw(camera,player)) больше shagAngle#, ТО
крутим камеру, чтобы уменьшить этот угол:
TurnEntity camera,0,Sgn(DeltaYaw(camera,player))*shagAngle#,0
ИНАЧЕ
TurnEntity camera,0,Sgn(DeltaYaw(camera,player))*DeltaYaw(cam era,player),0
этот поворот нужен для того, чтобы не было дерганья камеры
КонецЕСЛИ
================================================== ===============

shagAngle# может иметь фиксированное значение, например shagAngle# = 5.0, а может и переменное, например shagAngle# = DeltaYaw(camera,player) * 0.1 <--- в этом (втором) случае движение будет с ускорением: сначала быстро, потом медленнее...

Чё-нить понял из этого?

Жека 25.11.2005 16:44

Посмотри этот код, я комментарии везде поставил, должно быть всё понятно. Новые места отмечены ;============

Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()


Global player

Const typeplayer=1
Const typescene=2
Const typecamera=3


;=========================================================================
;тип, содержащий инфу о следящей камере
;entity - объект, за которым надо следить
;camera - сама камера
;target - пивот, место которого стремится занять камера
;если entity (наш игрок) стоит на месте, то камера тут будет
;heading - пивот, на который "смотрит" камера
;Z# - смещение по оси Z относительно entity (нашего игрока)
;Y# - смещение по оси Y
Type ChaseCam
        Field entity,camera,target,heading
        Field Z#
        Field Y#
End Type
;=========================================================================




scene=CreateCube()
wall1=CreateCube()
wall2=CreateCube()
wall3=CreateCube()
wall4=CreateCube()
camera=CreateCamera()
player=CreateCube()

;=========================================================================
;создаём объект cam как экземпляр типа ChaseCam
;т.к. в параметре функции указали player, то камера
;будет следить за игроком
Global cam.ChaseCam = CreateChaseCam.ChaseCam(player)
;=========================================================================


;------------------------------------------------;

PositionEntity player,25,5,20
TurnEntity camera,30,0,0
FitMesh scene,0,0,0,50,2,50
FitMesh wall1,0,2,0,2,2,50
FitMesh wall2,48,2,0,2,2,50
FitMesh wall3,0,2,0,50,2,2
FitMesh wall4,0,2,48,50,2,2
EntityColor scene ,0,255,0
EntityColor wall1,200,100,100
EntityColor wall2,200,100,100
EntityColor wall3,200,100,100
EntityColor wall4,200,100,100
EntityType scene,typescene
EntityType wall1,typescene
EntityType wall2,typescene
EntityType wall3,typescene
EntityType wall4,typescene
EntityType camera,typecamera
EntityType player,typeplayer
EntityRadius scene,.5
EntityColor player,255,0,0


Collisions typeplayer,typescene,2,3

;=========================================================================
;устанавливаем колизию камеры со сценой
Collisions typecamera,typescene,2,3
;=========================================================================



Repeat

;=========================================================================
;обновляем состояние камеры
UpdateChaseCam(cam)
;=========================================================================

TranslateEntity player,0,-1,0

spd#=0.5

;If KeyDown(75) TurnEntity camera,0,1,0
;If KeyDown(77) TurnEntity camera,0,-1,0
;If KeyDown(72) TurnEntity camera,1,0,0
;If KeyDown(80) TurnEntity camera,-1,0,0
;If KeyDown(71) MoveEntity camera,0,0,1
;If KeyDown(73) MoveEntity camera,0,0,-1
If KeyDown(200) MoveEntity player,0,0,spd#
If KeyDown(208) MoveEntity player,0,0,-spd#
If KeyDown(203) TurnEntity player,0,3,0
If KeyDown(205) TurnEntity player,0,-3,0



UpdateWorld
RenderWorld
Flip
Until KeyHit(1)

End


;=========================================================================
;эта функция создаёт и возвращает объект типа ChaseCam
Function CreateChaseCam.ChaseCam( entity )
;создаём объект
Local C.ChaseCam=New ChaseCam
C\entity=entity
;создаём камеру
c\camera=CreateCamera()

;устанавливаем начальное смещение
C\Z#=-10
C\Y#=5

;создаём цель, к этой точке будет стремиться камера
C\target=CreatePivot( entity )
;ставим цель на нужное место
PositionEntity C\target,0,C\Y#,C\Z#
;тип для колизии
EntityType C\target,typecamera

;точка, в которую камера будет смотреть
;т.к. не меняем её позицию, то
;смотреть будем на entity (игрока)
C\heading=CreatePivot( entity )

Return C
End Function

;функция обновления состояния камеры
Function UpdateChaseCam( C.ChaseCam )

;1 - сделать вид от 1го лица
If KeyHit(2) Then
        C\Z#=-0.1 C\Y#=0
        EntityAlpha player,0
End If

;2 - сделать вид от 3го лица, ближе
If KeyHit(3) Then
        C\Z#=-5 C\Y#=2
        EntityAlpha player,1
End If

;3 - сделать вид от 3го лица, дальше
If KeyHit(4) Then
        C\Z#=-10 C\Y#=5
        EntityAlpha player,1
End If

;получаем расстояние по трём осям между
;пивотом-целью и текущим положением камеры
dx#=EntityX(C\target,True)-EntityX(C\camera,True)
dy#=EntityY(c\target,True)-EntityY(c\camera,True)
dz#=EntityZ(C\target,True)-EntityZ(C\camera,True)

;двигаем камеру в сторону цели со скоростью
;в 1/10 расстояния мужду ними
TranslateEntity C\camera,dx*.05,dy*.05,dz*.05

;ограничение по оси Y точки, в которую
;смотрит камера (щас не используется,
;т.к. позицию heading нигде не меняем)
If EntityY#(C\heading)>40 Then PositionEntity(C\heading,EntityX#(C\heading),40,EntityZ#(C\heading))
If EntityY#(C\heading)<-50 Then PositionEntity(C\heading,EntityX#(C\heading),-50,EntityZ#(C\heading))

;заставляем камеру пялиться в нужную точку
PointEntity C\camera,C\heading

;здесь мы двигаем цель вплотную к объекту (игроку)
PositionEntity C\target,0,0,0
;теперь сбрасываем колизию для цели,
;чтобы камера не проходила сквозь стены
ResetEntity C\target
;и ставим её в фиксированное положение,
;которое определяется смещением по осям Y и Z
PositionEntity C\target,0,C\Y#,C\Z#

End Function
;=========================================================================


У меня вопрос ко всем: как работает команда ResetEntity entity?

impersonalis 25.11.2005 17:31

Resets the collision state of an entity.
Надо полагать - снимает все предустановленные коллизии с этого объекта.
Хотя чем она тогда отличается от
Entitytype entity,0
...

alcosholik 25.11.2005 20:31

Цитата:

Originally posted by impersonalis@Nov 25 2005, 03:31 PM
Хотя чем она тогда отличается от
Entitytype entity,0

Всем.
ResetEntity снимает текущие коллизии с объекта, т.е. проверка на коллизию этого объекта (EntityCollided) возвращает 0.
А EntityType entity,0 присваивает объекту нулевой тип => он больше не будет коллизиться.

impersonalis 25.11.2005 20:53

короче - очищает список коллизий, составленный последним UpdateWorld`ом.

Жека 25.11.2005 20:54

Я это понял, что текущие, до ближайшего АпдэйтВорлда.
Просто не углядел, что тип коллизии ставится не камере, а цели.
Тогда бы вопроса не было.

ПС: колизия = коллизия (не могу никак определиться, 2 буквы Л писать или 1)

Fant 27.11.2005 21:02

Вопрос мой закрыт!

Всем спасибо!

Разобрался!

Сделал!


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

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