I use this which seems to be pretty accurate.
Displays quads at 2D screen coordinates using a pivot (pivot2d) which the mesh is attached to.
Credit to skidracer (pixies routine):
Displays quads at 2D screen coordinates using a pivot (pivot2d) which the mesh is attached to.
Credit to skidracer (pixies routine):
; Quads at 2D pixel locations Const sw=640,sh=480 Const qwidth=180,qheight=120 ; quads width/height Graphics3D sw,sh,0,2 SetBuffer BackBuffer() HidePointer Type quad Field container ; container holding quad (surface) Field vert ; quads first vertex in container Field x,y ; quads x/y screen pos (in 2d pixels) Field w,h ; quads width and height (in 2d pixels) Field rotdir# End Type ; init 3d display (camera + quads pivot) spritecamera=CreateCamera() pivot2d=CreatePivot(spritecamera) aspect#=Float(GraphicsHeight())/Float(GraphicsWidth()) scale#=2.0/GraphicsWidth() PositionEntity pivot2d,-1,aspect,1.0001 ScaleEntity pivot2d,scale,scale,scale ; create a quad container (surface to hold quads) quadsurf=CreateQuadContainer(pivot2d) ; add quad to container pos(x,y) size(w,h) color(r,g,b) quad1.quad=NewQuad(quadsurf , 0,0 , qwidth,qheight , 60,200,70) MoveMouse 320,240 ; MAIN LOOP Repeat mx=MouseX() : my=MouseY() PositionQuad quad1,mx,my,0 RenderWorld ; just to confirm quad is displayed correctly ; let's draw a standard 2D rect (same pos/width) Color 170,10,60 Rect mx,my,qwidth,qheight,0 ; cursor Color 200,200,200 Line mx,my+8,mx,my-8 Line mx+8,my,mx-8,my Flip Until KeyHit(1) End ; create a container (surface) for holding quads Function CreateQuadContainer(pivot) Local quadmesh=CreateMesh(pivot) Local surf=CreateSurface(quadmesh) EntityFX quadmesh,1+2 ScaleEntity quadmesh,1,-1,1 PositionEntity quadmesh,-0.5,0.5,0 Return surf End Function ; adds a new quad to an existing container Function NewQuad.quad(surf,x,y,w,h,r=255,g=255,b=255) q.quad=New quad q\container=surf q\x=x : q\y=y : q\w=w : q\h=h q\vert=AddVertex(surf,x,y,0 ,0,0) AddVertex surf,x+w,y,0 ,1,0 AddVertex surf,x,y+h,0 ,0,1 AddVertex surf,x+w,y+h,0 ,1,1 AddTriangle surf,q\vert+0,q\vert+1,q\vert+2 AddTriangle surf,q\vert+3,q\vert+2,q\vert+1 For o=0 To 3 VertexColor surf,q\vert+o,r,g,b Next Repeat q\rotdir=Rnd(-2.5,2.5)+0.1 Until q\rotdir<>0 Return q End Function ; position quad at 2d pixel coordinates Function PositionQuad(q.quad,x,y,z#=1.0001) Local s=q\container , v=q\vert dx#=x-VertexX(s,v) : dy#=y-VertexY(s,v) : dz#=z-VertexZ(s,v) For o=0 To 3 VertexCoords s,v+o,VertexX(s,v+o)+dx,VertexY(s,v+o)+dy,VertexZ(s,v+o)+dz Next q\x=VertexX(s,v) : q\y=VertexY(s,v) End Function