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)

Mhyhr 17.06.2009 23:59

Ответ: Камера...
 
ken park Лады,завтра напишу тебе Хелпь на эту тему с моим любимым обилием комментированного кода. Заглядывай завтра в FAQ...;)
Зы: Аватар красивый)

Dzirt 18.06.2009 00:02

Ответ: Камера...
 
Вот поворот обэкта мышкой и не только ;)
Пользуйся на здоровье если розбереш.
Источник: Blitz et cetera

Код:

;CameraMouseView, on 10/10/06

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

camerapivot=CreatePivot() ;pivot
camera=CreateCamera(camerapivot) ;camera on pivot
camerabank=CreateBank(48) ;camera bank variables

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()

While Not KeyHit(1)
 UpdateWorld
 RenderWorld

 CameraMouseView(camerapivot,camera,camerabank)

 Text 0,0,"Press LShift to Zoom, LCtrl to Drag"

 Flip
Wend

Function CameraMouseView(camerapivot,camera,camerabank,speed#=0.05)
 ;camerapivot,camera,camerabank=valid handles, speed#=speed of view

 Local movex,movey,camx#,camy#,camz#,pivx#,pivz#,angle#,xaxis#,zaxis#

 ;error messages for invalid handles
 If camerapivot=0 Then RuntimeError "Pivot entity is zero!"
 If camera=0 Then RuntimeError "Camera entity is zero!"
 If camerabank=0 Then RuntimeError "Bank handle is zero!"

 ;set default values
 If speed#<0.01 Then speed#=0.01 ;min speed
 If PeekFloat(camerabank,36)=0 Then PokeFloat camerabank,36,-10 ;no camz

 ;update mouse variables
 PokeInt camerabank,0,PeekInt(camerabank,8) ;lastx=msex
 PokeInt camerabank,4,PeekInt(camerabank,16) ;lasty=msey
 PokeInt camerabank,8,MouseX() ;msex
 PokeInt camerabank,16,MouseY() ;msey
 PokeInt camerabank,20,MouseX()-PeekInt(camerabank,0) ;movex=msex-lastx
 PokeInt camerabank,24,MouseY()-PeekInt(camerabank,4) ;movey=msey-lasty

 ;fill in the position/rotation variables
 movex=PeekInt(camerabank,20)
 movey=PeekInt(camerabank,24)
 camx#=PeekFloat(camerabank,28)
 camy#=PeekFloat(camerabank,32)
 camz#=PeekFloat(camerabank,36)
 pivx#=PeekFloat(camerabank,40)
 pivz#=PeekFloat(camerabank,44)

 If MouseDown(1) ;Left Mouse button
  If KeyDown(29) ;Left Ctrl key, camera drag
  angle#=camy# : xaxis#=speed# : zaxis#=speed# ;init xz axis
  If angle#>90 And angle#<270 Then zaxis#=-zaxis# ;-z if 90..270
  If angle#>180 Then angle#=360-angle# : xaxis#=-xaxis# ;-x if 180..360
  If angle#>90 Then angle#=180-angle# ;reduce y angle to 90
  angle#=angle#*0.011 ;y as fraction of 1, ie. 90->100
  ;set mouse xy movements by y fraction and add to pivot xz positions
  pivx#=pivx#-(movex*(1-angle#)*zaxis#)-(movey*angle#*xaxis#)
  pivz#=pivz#-(movex*angle#*xaxis#)+(movey*(1-angle#)*zaxis#)
  ElseIf KeyDown(42) ;Left Shift key, camera zoom
  camz#=camz#-movey*speed#  ;-msey sets camera z mt
  If camz#>-3 Then camz#=-3 ;limit zoom to 3mt
  Else ;camera rotation
  camx#=camx#+(movey*10*speed#) ;mousey sets camera x dg
  If camx#>90 Then camx#=90  ;limit x to -90..90
  If camx#<-90 Then camx#=-90
  camy#=camy#-(movex*10*speed#) ;-mousex sets camera y dg
  If camy#>359 Then camy#=0  ;limit y to 0..360
  If camy#<0 Then camy#=359
  EndIf
 EndIf

 ;update position/rotation variables
 PokeFloat camerabank,28,camx#
 PokeFloat camerabank,32,camy#
 PokeFloat camerabank,36,camz#
 PokeFloat camerabank,40,pivx#
 PokeFloat camerabank,44,pivz#

 ;move pivot, rotate and zoom camera
 PositionEntity camerapivot,pivx#,0,pivz# ;drag
 RotateEntity camerapivot,camx#,camy#,0 ;rotate
 PositionEntity camera,0,0,camz# ;zoom

End Function


ken park 18.06.2009 00:04

Ответ: Камера...
 
Блин, ребята. Вы меня спасаете, огромнеишее спасибо! Я стараюсь вникать и понимать )

ken park 18.06.2009 00:11

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

Сообщение от pinqin (Сообщение 108024)
ken park Лады,завтра напишу тебе Хелпь на эту тему с моим любимым обилием комментированного кода. Заглядывай завтра в FAQ...;)
Зы: Аватар красивый)

спасибо ) буду ждать )
зы: пасиба ^^

Антихрист 18.06.2009 08:07

Ответ: Камера...
 
ken park-для спасибо есть кнопочка-полезно!

pitonms 18.06.2009 12:36

Ответ: Камера...
 
ken park Ты просто просишь всех сделать за тебя игру

Sleepybear 18.06.2009 12:41

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

Сообщение от ken park (Сообщение 108026)
Блин, ребята. Вы меня спасаете, огромнеишее спасибо! Я стараюсь вникать и понимать )

Ты постораяся читать что пишут!!


Не тупо вставлять а хотябы переписовать. Это заставит тебя прочитать.

Mhyhr 18.06.2009 16:44

Ответ: Камера...
 
Вложений: 1
Воообщем сегодня у меня времени нет совсем:mad: как оказалось, но что то я сделал и решил тут выложить,
Смотри по теории думаю по картинке всё станет ясно:
Код мало комментировал но думаю вникнешь...


В атаче Если не будет фоновой текстуры земли то отключи текстуру нафиг или вставь свою:crazy: )
Да и я не уверен что понял твой вопрос на все сто но если что обращайся)

Mhyhr 18.06.2009 20:01

Ответ: Камера...
 
Воть тут нашел оч интересный материал

СОЗДАНИЕ ПЛАВНОЙ КАМЕРЫ

Const mousespeed# = 0.4
Const camerasmoothness# = 3

;C числами (0.4 и 3) можете по экспериментировать .
Далее>>>
;Это в главный цикл

u#=75; Предельный угол , можете поменять на свой
mx#=CurveValue(MouseXSpeed()*mousespeed,mx,cameras moothness)
my#=CurveValue(MouseYSpeed()*mousespeed,my,cameras moothness)
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
pitch#=EntityX(Camera)
yaw#=EntityYaw(user)
pitch=pitch+my
yaw=yaw-mx
If pitch>75 pitch=75
If pitch<-75 pitch=-75
TurnEntity camera,pitch,0,0
RotateEntity user,0,yaw,0
If Abs(EntityPitch#(camera))>u# RotateEntity camera,u#*Sgn(EntityPitch#(camera)),0,0

;Так , то что внизу напишите между WEND и END

Function CurveValue#(newvalue#,oldvalue#,increments )
If increments>1 oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments
If increments<=1 oldvalue=newvalue
Return oldvalue#
End Function

Сайт: maxgames.net.ru

Mr_F_ 18.06.2009 21:25

Ответ: Камера...
 
хера 5 страниц нафлудили о_0
ну ваще всё проще

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

ставим камеру за челом, парентуем её к пивоту.

просто вращаем пивот с помощью mousexspeed()/mouseyspeed(), так же как мы вращаем камеру в виде от 1 лица (а примеров такой камеры инет полон), при этом камеру поинтим на него.

теперь УЖЕ в результате нехитрых манипуляций мы сможем смотреть вокруг перса. по хорошему конечно можно ещё долго совершенствовать, в большинстве игр движение камеры вокруг перса не идёт тупо по сфере, ну и плюс коллизия камеры должна быть (блицевской коллизией элементарно делается так же как в кастле а вот с физыксом мудренее).

терь чтоб чел ехал в сторону куда мы смотрим делаем как-то так:

TformVector 0,0,1,cam,Character
tx#=tformedx#()
ty#=tformedy#()
tz#=tformedz#()

этим мы трансформируем направление "вперед по z" из пространства камеры в пространство чела. другими словами, если для уезда вперёд камере нужно применить moveentity cam,0,0,1 то для мува в ту же сторону другому объекту нужно конвернуть это значение в его локальную систему.

по идее есть мувить теперь перса на tx,ty,tz он будет мувится туда же куда смотртит камера.
чтоб он не летел вверх и вниз тут надо чето ограничить, во-первых конечно не мувить по у, во-вторых сдаётся мне не использовать дробные значения а то скорость будет всегда разной.
лучше так:
MoveEntity Character,Sgn(tx),0,Sgn(tz)

Sgn возвращает знак числа, т.е хоть у нас 0.5, 0.25 или 0.99 все равно будет 1 (или -1 или 0).

терь по ходу надо чтоб он ротейтился в сторону куда идёт.
ну тут много вариантов, можно самому вычислять, можно припарентить к камере пивот который всегда будет спереди и ПЕРЕД персом и поинтить его туда, обнуляя затем все ротации кроме Y.

а кстати нельзя парентить пивот к персу а то кажется чето не то будет когда он повернётся.
надо просто ставить его в цикле в позицию бошки.

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

ABTOMAT 18.06.2009 22:50

Ответ: Камера...
 
А я всё ждал пока афтор сам догадаетцо.

Mhyhr 19.06.2009 00:30

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

А я всё ждал пока афтор сам догадаетцо.
Убил наповал:-D

pitonms 19.06.2009 08:45

Ответ: Камера...
 
Вложений: 1
Вот смотри на скрин и думай как это самому сделать, я догодался сам ибо есть HELP и GOOGLE:cool: и я изучаю BlitZ3D месяц!!!

ken park 01.07.2009 23:38

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

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()
cube=CreateCube()
light=CreateLight()

plane=CreateCube()
ScaleEntity plane,30,1,30
MoveEntity plane,0,-2,0
EntityColor plane,155,0,0

cam=CreateCamera()
PositionEntity cam,0,2,-10
EntityParent cam,cube

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyHit(1)

If KeyDown(31) Or KeyDown(208) MoveEntity plane,0,0,.1
If KeyDown(32) Or KeyDown(205) MoveEntity plane,-.1,0,0
If KeyDown(17) Or KeyDown(200) MoveEntity plane,0,0,-.1
If KeyDown(30) Or KeyDown(203) MoveEntity plane, .1,0,0

PointEntity cam,cube

UpdateWorld
RenderWorld()
Flip
Wend
End


ken park 01.07.2009 23:40

Ответ: Камера...
 
и после того как я повернул куб, потом после нажатия кнопки вверх (как бе идти вперед) он бежал в ту сторону, в которую сейчас лицом как бе. если не сложно. пасиба

ABTOMAT 02.07.2009 01:50

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

мне надо сделать поворот обьекта мышкою.. а вот как хз) помогите) вот код
Поворачивают при помощи TurnEntity
С мышки тебе понадобятся MouseXSpeed и MouseYSpeed
Чтобы он шёл в ту сторону куда он лицом - это MoveEntity
Как получить прерывания клавиш - надеюсь, знаешь

ken park 03.07.2009 00:26

Ответ: Камера...
 
а как вот это все реализовать..

ArtemkA 03.07.2009 00:58

Ответ: Камера...
 
У тебя че подобных примеров чтоль нет?

Вот вращение объекта мышью:
mxs#=MouseXSpeed() ; скорость мыши по X
mys#=MouseYSpeed() ; скорость мыши по Y
CubeXRot#=CubeXRot#+mys#*0.2
CubeYRot#=CubeYRot#+mxs#*0.2
; Вставляешь ети две переменные в функцию RotateEntity
RotateEntity cube,CubeXRot#,CubeYRot#,0

Amatsu 03.07.2009 09:08

Ответ: Камера...
 
Вложений: 1
Может поможет (WASD - перемещение, мышь - вращение камеры)

ken park 04.07.2009 00:14

Ответ: Камера...
 
пасибааа, офигенная вещь... это.. а как сделать чтобы на до конца вверх можно было поворачиваться камеру, а чтобы на середине останавлявалось. ну чтобы короче нельзя на вернхнюю часть куба посмотрить

ArtemkA 04.07.2009 00:28

Ответ: Камера...
 
вот меня эти значения:

If dest_yang<-85 Then dest_yang=-85
If dest_yang>85 Then dest_yang=85

NitE 04.07.2009 01:30

Ответ: Камера...
 
ken park, отличная идея ! я придумал как решить все твой вопросы/проблемы - воспользоватся мозгом ! ... он ведь всётаки не просто так тебе дан


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

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