|
3D-программирование Вопросы, касающиеся программирования 3D мира |
09.11.2010, 23:10
|
#1
|
AnyKey`щик
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
Всех приветствую! Я новичек... жуть как хочется освоить этот язык...
Что имеется: *земля и небо(в виде куба-вид изнутри)
*персонаж - простая сфера(пока не разобрался с пачем на 3дмакс 2009)
*сферой можно упрвлять "WSAD"
*Камера на небольшом расстянии смотрит на сферу, при этом можно передвигая мышь крутится вокруг неё, но тут возникла проблема...передвинув мышь сферу начинает мотать из стороны в сторону, можно с земли на небо улететь ), ограничения на вращение нет(просто не знаю как поставить)
Вопросы:
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?
2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры" ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...
Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?
Очень прошу, помогите оптимизировать код...
полный код:
Graphics3D 800,600,32,1;
SetBuffer BackBuffer()
lit=CreateLight(2);
RotateEntity lit,90,0,0
AmbientLight 200,200,200
Include "CONST.bb";
Include "COLLISIONS.bb"
Include "GLOBAL.bb"
Text 320,0,"Click to reset mouse",True
Text 0,0,"Mouse X:"+MouseX()
Text 0,10,"Mouse Y:"+MouseY()
If MouseDown(1) Or MouseDown(2) Then MoveMouse 320,240
Text MouseX(),MouseY(),"X",True,True
Flip
;mouse.bb
;ShowPointer()
;Global mouse_pic=LoadImage( "Picture.bmp" )
;While Not KeyHit(1)=1
;UpdateWorld()
;RenderWorld()
;Cls
;DrawImage mouse_pic, MouseX(),MouseY()
;Flip
;Wend
;-------------------------------------------------------------
Setup();
period=1000/FPS;
time=MilliSecs()-period;
;MAIN LOOP ; -----------------------------------------
While Not KeyHit(1)=1;
Include "FPS.bb";
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
;tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If k=ticks Then CaptureWorld
Update_Game()
UpdateWorld()
Next
RenderWorld ; tween
Text 0,0,"user x="+EntityX(user,1);
Text 0,15,"user y="+EntityY(user,1)
Text 0,30,"user z="+EntityZ(user,1)
Text 0,45,"centr y="+EntityY(centr,1)
Text 0,90,"Треугольников рендерится: "+TrisRendered()
Text 0,105,"fps: "+Framecounter_framerate
Flip
Wend
;--------------------------------------------------------------
;ClearWorld();
Function Setup()
font=LoadFont("Arial Cyr",16,True,False,True)
SetFont font
Color 255,0,0
create_ground()
sky=MakeSkyBox("textures\nebo\")
ScaleEntity sky,20,20,20
create_user()
End Function
Function create_ground()
terrain=CreatePlane()
tertex=LoadTexture("textures\zemlya\grass.jpg")
ScaleTexture tertex,10,10
EntityTexture terrain,tertex
; FreeTexture tertex
EntityType terrain,TERRT
EntityPickMode terrain,2
End Function
Function MakeSkyBox( file$ )
m=CreateMesh()
b=LoadBrush( file$+"front.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
b=LoadBrush( file$+"right.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
b=LoadBrush( file$+"back.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
b=LoadBrush( file$+"left.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
b=LoadBrush( file$+"up.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleMesh m,100,100,100
FlipMesh m
EntityFX m,9
EntityOrder m,10
Return m
End Function
Function create_user(x#=-0,y#=4,z#=0)
user=CreateSphere()
EntityRadius user,3,3
EntityType user,USERT
centr=CreatePivot (user)
MoveEntity centr,0,4,-10
camera=CreateCamera(centr)
CameraRange camera,0.10,10000
;CameraRange camera,0.01,10000;
microphone=CreateListener(camera,.2,1,.2); звуки
PositionEntity user,x#,y#,z#
End Function
Function update_user()
If KeyHit(46) us=us+1
If us=2 us=0
If us=1 And kcam=0
MoveEntity centr,0,-0.15,0
If EntityY (centr,1)=<EntityY(user,1) Then kcam=1:ncam=1:V1#=0.05:EntityRadius user,2,3
EndIf
If us=0 And kcam=1
PositionEntity user,EntityX(user),EntityY(user)+1.8,EntityZ(user),1
EntityRadius user,3,3
PositionEntity centr,EntityX(user),EntityY(user)-1.8,EntityZ(user),1
kcam=0
EndIf
If kcam=0 And ncam=1
MoveEntity centr,0,0.15,0
If EntityY (centr,1)=>EntityY(user,1)+2.5 Then ncam=0:V1#=0.2
EndIf
pick_ent=LinePick(EntityX(user),EntityY(user),EntityZ(user),0,-3.6,0)
If pick_ent
jump_bool=False
Else
jump_bool=True
EndIf
If KeyHit(57) And jump_bool=False And ncam=0 Then jmp#=0.7:j#=EntityY(user,1)
If EntityY (user,1)=>j#+8 Then jmp#=0
MoveEntity user,0,jmp#-G#,0
If KeyDown(42)=1
V2#=V1#+V1#*0.5
Else
V2#=V1#
EndIf
If KeyDown(30)=1 MoveEntity user,-V2#,0,0
If KeyDown(32)=1 MoveEntity user,V2#,0,0
If KeyDown(17)=1 MoveEntity user,0,0,+V2#
If KeyDown(31)=1 MoveEntity user,0,0,-V2#
;-----------------------------
TurnEntity user,MouseYSpeed()*0.3,0,0
TurnEntity user,0,-MouseXSpeed()*0.5,0
;-----===================-----
If KeyDown(30)=1 Then MoveEntity user,-V#,0,0
If KeyDown(32)=1 Then MoveEntity user,V#,0,0
If KeyDown(17)=1 Then MoveEntity user,0,0,+V#
If KeyDown(31)=1 Then MoveEntity user,0,0,-V#
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
If Abs(EntityPitch#(camera))>u# RotateEntity camera,u#*Sgn(EntityPitch#(camera)),0,0 ;
Return
End Function
Function Update_Game()
update_user;
End Function
;CONST.bb
Const G#=0.4;
Const u#=70;п
Const USERT=1;
Const TERRT=2;
Const FPS=50
;GLOBAL.bb
Global centr;
Global camera
Global user;
Global V1#=0.2;
Global j#;
Global jmp#;
Global kcam;
Global ncam;
Global us;
;COLLISIONS.bb
Collisions USERT,TERRT,2,3
|
(Offline)
|
|
09.11.2010, 23:26
|
#2
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений (для 1,962 пользователей)
|
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?
|
Проблема решится написанием своего кода
2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры" ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...
|
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())
Сообщение от Слейпнир
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?
|
Проще простого: привязываешь камеру к объекту и перемещаешь её
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.11.2010, 23:34
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
09.11.2010, 23:44
|
#4
|
AnyKey`щик
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
Сообщение от baton4ik
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())
|
Вствлял это
ShowPointer()
Global mouse_pic=LoadImage( "Picture.bmp" )
While Not KeyHit(1)=1
UpdateWorld()
RenderWorld()
Cls
DrawImage mouse_pic, MouseX(),MouseY()
Flip
Wend
практически во все части кода, пытался убрать строки While Not KeyHit(1)=1 и Wend, UpdateWorld() и RenderWorld()...пытался в конце кода Wend поставить...пробовал просто вот так:
Global mouse_pic=LoadImage( "Picture.bmp" )
DrawImage mouse_pic, MouseX(),MouseY()
Из моих методов тыка иногда мышь появлялась на черном экране, нормально двигалась, после нажатия Esc появляась игра(ну там земля-небо-сфера...)
Сообщение от baton4ik
Проще простого: привязываешь камеру к объекту и перемещаешь её
|
Где-то в коде камера привязана к объекту(не уверен), но при движении мышкой почемуто двигается сфера... не могу найти где убрать это ее движение и летание, надо ведь чтоб просто объект стоял на месте при вращении
|
(Offline)
|
|
09.11.2010, 23:48
|
#5
|
AnyKey`щик
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
может выложить сие чудо ?
|
(Offline)
|
|
10.11.2010, 00:02
|
#6
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений (для 1,962 пользователей)
|
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши
Чувак, ну дам я тебе код, ты ничего не поймёшь. Удаляй это мимо корзины и учи всё с самого начала. Если б ты учил, то знал бы, что рисовать надо между рендером и флипом.
------------------
Беглым просмотром кода привязку не нашёл. Привязывай в цикле с PointEntity и потом перемещай камеру.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:19.
|