Help with placing 3d object with mouse
Blitz3D Forums/Blitz3D Programming/Help with placing 3d object with mouse
| ||
| How could I fix this? |
| ||
| fix what? |
| ||
| it's not placing at the position of mouse x and y. it's way off of the screen. |
| ||
| MouseX/MouseY (0, 0) starts top-left of the 2D screen, (0, 0) in 3D starts in the centre. |
| ||
| MouseX/Y are screen coordinates while PositionEntity uses 3D world coordinates. You need some way to find out where the mouse pointer is pointing in the 3D world. Here is one possible approach. ; Invisible plane is horizontal, all y values are zero. ; Click left mouse button to place a sphere. ; Escape quits. Graphics3D 1200, 800, 0, 2 SetBuffer BackBuffer() plane = CreatePlane() EntityAlpha plane, 0 ; invisible EntityPickMode plane, 2 ; but pickable cam = CreateCamera() PositionEntity cam, 0, +30, -40 AlignToVector cam, 0, -30, +40, 3 CameraZoom cam, 8 sph = CreateSphere() ScaleEntity sph, 0.2, 0.2, 0.2 EntityColor sph, 255,255,0 While Not KeyDown(1) If MouseHit( 1 ) mx = MouseX() my = MouseY() PickedEntity = CameraPick( cam, mx, my ) If PickedEntity = plane temp = CopyEntity( sph ) EntityColor temp, Rand( 100, 250 ), Rand( 100, 250 ), Rand( 100, 250 ) PositionEntity temp, PickedX(), PickedY(), PickedZ() End If End If RenderWorld Text 50, 40, "Mouse x,y: " + mx + " " + my Text 50, 65, "Entity: " + PickedEntity Text 50, 90, "World x,y,z: " + PickedX() + " " + PickedY() + " " + PickedZ() Flip Wend |
| ||
| Dont know, whether there is maybe a special function that works better than my workaround... I tried out, where are the last visible positions of an object in your current camera range. Results: Objects are visible from x=-10 to +10 and y=+7 to -7. So I calculate MouseX into ReversProjectedX(): Function AddObject(x#,y#)
obj.oobject = New oobject
; your screen range in world coordinates: x= -10 to + 10 and y= 7 to -7
obj\x#=ReversProjectedX(x)
obj\y#=ReversProjectedY(y)
nofobjects=nofobjects+1
;obj\mesh=LoadMesh("assets\objects\box.b3d")
obj\mesh=CreateCube()
ScaleEntity obj\mesh,1,1,1
PositionEntity obj\mesh,obj\x#,obj\y#,0
EntityColor obj\mesh,12,255,15
EntityType obj\mesh,2
End Function
Function ReversProjectedX#(x#)
Return (x-400)/40.0
End Function
Function ReversProjectedY#(y#)
Return -(y-300)/40.0
End Function |
| ||
| Thanks |
| ||
| If this is to do with offsets then this might help you understand. I you mover the camera to the right and down then (0, 0) with appear to be the top-left of the screen. My code below is a bit crude but sort of works, I never was one for 3D stuff. You will also need to add in some culling to stop it flying way out of the screen. |
| ||
try this instead..trying to position using MouseX and MouseY needs to translate to 3 dimensions.
Graphics3D 900,700,32,2
SetBuffer BackBuffer()
AntiAlias True
Global nofobjects,cam,tex
;Global up_key = 200, down_key = 208, left_key = 203, right_key = 205
Global W_key = 17, S_key = 31, A_key = 30, D_key = 32
AppTitle("Revised Editor")
; Create texture of size 48,48
tex=CreateTexture(48,48)
; Set buffer - texture buffer
SetBuffer TextureBuffer(tex)
; Clear texture buffer with background color
ClsColor 0,0,0
Cls
For t=1 To 48
For ty=1 To 48
If t Mod 3>0 Then
Color 50,50,50
Plot t,ty
Else
Color 0,100,60
Plot t,ty
End If
Next ;ty
Next ;t
; Set buffer - backbuffer
SetBuffer BackBuffer()
;__________________________________
plane=CreatePlane()
EntityTexture plane,tex ;use generated "tex" image
objj=CreateCube()
PositionEntity objj,0,.7,0
EntityAlpha objj,.5
ScaleEntity objj,.5,.5,.5
cam=CreateCamera(objj)
CameraRange cam,1,200
CameraFogColor cam,20,20,40
CameraFogMode cam,1
CameraFogRange cam,20,60
PositionEntity cam,0,10,-14
SetupLighting()
;------------MAIN----------------------
While Not KeyDown(1)
mx=EntityX#(objj)+0
my=EntityY#(objj)-1
z=EntityZ#(objj)
object_key_control_2(objj)
UpdateWorld()
PointEntity cam,objj
If KeyDown(67)
PositionEntity cam,0,4,-15
EndIf
If Not KeyDown(67) Then
PositionEntity cam,0,10,-14
End If
If MouseHit(1) Then
AddObject(mx,my,z)
End If
RenderWorld()
Color 255,255,255
Text 2,20,"X Position:"+mx
Text 2,40,"Y Position:"+my
Text 2,60,"Z Position: "+EntityZ#( objj)
Text 2,80,"Objects:"+nofobjects
Text 2,110,"W A S D to move, Mouse button 1 to place cube, F9-and HOLD,alter camera angle(release F9 to reset)"
Flip
Wend
End
;-------------------------end of main
Function SetupLighting()
;light=CreateLight(2)
AmbientLight 255,255,255
End Function
Function AddObject(x#,y#,z#)
obj.oobject = New oobject
obj\x#=x#
obj\y#=y#
obj\z#=z
nofobjects=nofobjects+1
obj\mesh=CreateCube()
ScaleEntity obj\mesh,.5,1,.5
PositionEntity obj\mesh,obj\x#,obj\y#,obj\z#
EntityColor obj\mesh,Rnd(100,150),Rnd(100,150),Rnd(100,150)
EntityType obj\mesh,2
End Function
Type OObject
Field x#,y#,z#,mesh
End Type
;Function object_key_control( objj )
; If KeyDown( up_key ) = True Then MoveEntity obj, 0, 0, .2
; If KeyDown( down_key ) = True Then MoveEntity obj, 0, 0, -.2
; If KeyDown( left_key ) = True Then TurnEntity obj, 0, 2, 0
; If KeyDown( right_key ) = True Then TurnEntity obj, 0, -2, 0
;End Function
Function object_key_control_2(objj)
If KeyDown( W_key ) = True Then MoveEntity objj, 0, 0, .2
If KeyDown( S_key ) = True Then MoveEntity objj, 0, 0, -.2
If KeyDown( A_key ) = True Then TurnEntity objj, 0, 2, 0
If KeyDown( D_key ) = True Then TurnEntity objj, 0, -2, 0
End Function
|
| ||
| ... and this: 2D-to-3D entity positioning (or something) |
| ||
| doesn't seem to work when I move the camera to left and add object. |
| ||
| so try and figure it out Caton! ;) A 3d model making program uses a 2D Grid overlay to help in positioning. That is easy to do. If you look at the example I gave you you also need a base level grid to help in positioning. Start by making a flat build surface(a "plane") or a 3D terrain or mesh-use a pattern for it that has a repeating pattern 1 unit across. for a terrain you can easily change the texture to a seamless "ground" one later. |
| ||
| My workaround was based on a fix camera position. But there is also a chance to calculate it with moving camera: When you move the camera, you have to add/sub the camera position to the calculated object coordinates: |