3d Wire Grid (Help Improvements)
Blitz3D Forums/Blitz3D Programming/3d Wire Grid (Help Improvements)
| ||
Function createline(x1#,y1#,z1#, x2#,y2#,z2#, mesh=0) If mesh = 0 Then mesh=CreateMesh() EntityFX(mesh,16) surf=CreateSurface(mesh) verts = 0 AddVertex surf,x1#,y1#,z1#,0,0 Else surf = GetSurface(mesh,1) verts = CountVertices(surf)-1 End If AddVertex surf,(x1#+x2#)/2,(y1#+y2#)/2,(z1#+z2#)/2,0,0 ; you could skip creating the above vertex and change the line below to ;AddTriangle surf,verts,verts+1,verts+0 ; so your line mesh would use less vertices, the drawback is that some videocards (like the matrox g400) ; aren't able to create a triangle with 2 vertices. so, it's your call :) AddVertex surf,x2#,y2#,z2#,1,0 AddTriangle surf,verts,verts+2,verts+1 Return mesh End Function ; --- set graphics Graphics3D 640,480,32,0 SetBuffer(BackBuffer()) AntiAlias False ; --- create scene setup camPiv = CreatePivot() camera = CreateCamera(camPiv) CameraClsColor camera,128,128,128 PositionEntity(camera, 0,0,-10) light=CreateLight(2) PositionEntity(light,4,10,0) LightRange(light,10) ; --- create lines lines = createLine(-1+x#,1+x#,1, 1+x#,1+x#,1) lines = createLine(1+x#,1+x#,1, 1+x#,-1+x#,1, lines) lines = createLine(1+x#,-1+x#,1, -1+x#,-1+x#,1, lines) lines = createLine(-1+x#,-1+x#,1, -1+x#,1+x#,1, lines) EntityColor(lines, 0,0,0) HideEntity lines gsize=24 x=-gsize y=-gsize Repeat l=CopyEntity(lines) PositionEntity l,x,0,y RotateEntity l,90,0,0 x=x+2 If x=>gsize Then x=-gsize : y=y+2 Until y=>gsize CreateSphere() ;TurnEntity(campiv, 35,35,35) While Not KeyHit(1) ; --- camera controls scrollwheel = MouseZSpeed() If MouseDown(1) Then TurnEntity(camPiv, MouseYSpeed(),-MouseXSpeed(),0) Else If scrollwheel <> 0 Then MoveEntity(camera, 0,0,scrollwheel*3) Else dummy = MouseYSpeed():dummy = MouseXSpeed():dummy = MouseZSpeed() ; prevent mousespeed blips. End If ; --- rendering CameraClsMode(camera, 1, 1) WireFrame(0) RenderWorld() CameraClsMode(camera, 0, 0) WireFrame(1) RenderWorld() Flip() Wend End Can anyone improve on this?, it seams a little over kill. While this works, I'd much rather the grid be infinit in x,y & z rather than just an area, anyone have any idea how ? |
| ||
There's a much better way done by kokejbaby or someone - can't remember his nick. It was the fastest/best way to do wireframes though! Beaks and Fredborg will also probably know which one I'm talking about. It uses mesh tricks. |
| ||
Cool thanks, I shall await there reply. :D |
| ||
Here's the 3D line function I use, based on the code by that guy BloodLocust mentions. :) Did someone come up with an even better method, then?; ; Adds a 3D line to the specified mesh. ; Note: 3D lines are only properly visible when rendered in wireframe mode! ; ; Params: ; mesh - Mesh to add 3D line to. If 0, a new mesh is created. ; x0,y0,z0 - Start point of line. ; x1,y2,z1 - End point of line. ; r,g,b - Line colour. ; ; Returns: ; Handle of mesh the 3D line was added to. ; Function create_3D_line(mesh,x0#,y0#,z0#,x1#,y1#,z1#,r%=255,g%=255,b%=255) If mesh = 0 mesh = CreateMesh() surf = CreateSurface(mesh) EntityFX mesh,1+2+16 Else last_surf = CountSurfaces(mesh) surf = GetSurface(mesh,last_surf) If CountVertices(surf) > 30000 Then surf = CreateSurface(mesh) End If v0 = AddVertex(surf,x0,y0,z0) v1 = AddVertex(surf,x1,y1,z1) v2 = AddVertex(surf,x0,y0,z0) AddTriangle surf,v0,v1,v2 VertexColor surf,v0,r,g,b VertexColor surf,v1,r,g,b VertexColor surf,v2,r,g,b Return mesh End Function It's similar to yours, Inner, but instead of putting a vertex in the middle of the line, it simply puts 2 verts at one end and 1 vert at the other. The reason for this is so lines can have individual colours (using vertex colouring) and, more importantly, the lines are better quality (putting a vert in the middle tends to make some lines look too thick in places). As for infinite lines, just make them massively long. |
| ||
Thanks that works a lot better, however making them massively long like 3000 for example makes the lines go screwy. |
| ||
the vertex in the middle is for old video card compatibility; some old card won't render the 'triangle' if one of its three corners is made from the same vertex. |
| ||
I'm using 3 separate verts for each 'line', just that 2 have the same coords. Will this still cause probs on older cards, then? |
| ||
i can't remember, i personally don't have an old card here. when i use my lines i actually never use the 3 vertex variant. by the way, this is my grid function: Function createGrid(w#,d#, dw#,dd#, r=212,g=212,b=212, centerR=227, centerG=227, centerB=227) grid = CreatePivot() PositionEntity(grid, w#/2, 0,d#/2) hx = (w#/dw#)/2 + 1 For x# = 0 To w#/dw# x_ = x_ + 1 l = createLine(x*dw#,0,0, x*dw#,0,d) EntityFX(l, 16+1+8) If x_ = hx EntityColor(l, centerR,centerG,centerB) Else EntityColor(l, r,g,b) EndIf EntityParent(l, grid) Next hz = (d#/dd#)/2 + 1 For z# = 0 To d#/dd# z_ = z_ + 1 l = createLine(0,0,z*dd#, w,0,z*dd#) EntityFX(l, 16+1+8) If z_ = hz EntityColor(l, centerR,centerG,centerB) Else EntityColor(l, r,g,b) EndIf EntityParent(l, grid) Next PositionEntity(grid, 0,0,0) Return grid End Function not brilliant, but it works :) |
| ||
On some (older cards - I had one) the card culls tris that have verts in the same place. |
| ||
Works OK on my GeForce 256. How much older than this are you talking? |
| ||
hehehehe, we're talking stoneage here. i beleive the card in question was a matrox g400, but i could be wrong. |