TransparetnWireframeHOW

How to draw only edges of 3d object, BUT with visible all edges, as it is truly made of wire (i.e. the wire behind the body must be visible too).

I draw simple Pyramid with square bottom and rotate it. This is object “ob”.
I try this:

ob.setRenderModeWireframe()
ob.setRenderModeThickness(5)

the Wires are visible, but NO these that are behind the “invisible” body of the Pyramid as it rotates.

I try some things, that I do not understand like:
ob.setDepthWrite(False)
ob.setDepthTest(False)
ob.setAttrib(DepthTestAttrib.make(RenderAttrib.MAlways))

but this do not change anything!

I try also transparency, but the wires turn transparent, and these that are behind the invisible body, are also invisible.

How to make model to look entirely like real body, made of wire?

Another question:

I make model as Geom from TRIANGLES, Panda have no Squads, therefore, the Pyramid base, which is SQUARE, made of TWO Triangles - in “wireframe” shows the diagonal vetex.

Is it possible to hide it?!

(I make the Pyramid from 6 fully independent triangles - 4 for the sides and 2 for the square base, to set independent vertices normals, the result is not so sharp… btw).

If the fully code is necessary:

from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
from direct.task import Task
from math import *

vdata = GeomVertexData("vertices", GeomVertexFormat.getV3n3(), Geom.UHStatic)
vdata.setNumRows(18)

k = sqrt(1.0/2)

vertexWriter = GeomVertexWriter(vdata, "vertex")
normalWriter = GeomVertexWriter(vdata, "normal")

vertexWriter.addData3f(100, -100, -50);  normalWriter.addData3f(0, 0, -1);   
vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, 0, -1);   
vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, 0, -1);   

vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, 0, -1);   
vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(0, 0, -1);   
vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, 0, -1);   


vertexWriter.addData3f(100, -100, -50); normalWriter.addData3f(0, -k, k);   
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(0, -k, k);   
vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, -k, k);   
  
vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(k, 0, k);   
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(k, 0, k);   
vertexWriter.addData3f(100, -100, -50); normalWriter.addData3f(k, 0, k);   
  
vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(0, k, k);   
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(0, k, k);   
vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, k, k);   
  
vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(-k, 0, k);
vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(-k, 0, k); 
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(-k, 0, k);   
  
tris=GeomTriangles(Geom.UHStatic)

tris.setShadeModel(Geom.SM_uniform)

tris.addVertex(0)
tris.addVertex(1)
tris.addVertex(2)
tris.closePrimitive()

tris.addVertex(3)
tris.addVertex(4)
tris.addVertex(5)
tris.closePrimitive()


tris.addVertex(6)
tris.addVertex(7)
tris.addVertex(8)
tris.closePrimitive()

tris.addVertex(9)
tris.addVertex(10)
tris.addVertex(11)
tris.closePrimitive()

tris.addVertex(12)
tris.addVertex(13)
tris.addVertex(14)
tris.closePrimitive()

tris.addVertex(15)
tris.addVertex(16)
tris.addVertex(17)
tris.closePrimitive()

squareGeom=Geom(vdata)
squareGeom.addPrimitive(tris)

squareGN=GeomNode("square")
squareGN.addGeom(squareGeom)

app = ShowBase()
ob = app.render.attachNewNode(squareGN)
ob.setAntialias(AntialiasAttrib.MMultisample)

#ob.node().setAttrib(ShadeModelAttrib.make(ShadeModelAttrib.MSmooth))
#ob.node().setAttrib(ShadeModelAttrib.make(ShadeModelAttrib.MFlat))
ob.setRenderModeWireframe()
ob.setRenderModeThickness(5)
ob.setRenderModePerspective(True)

ob.setDepthWrite(False)
ob.setDepthTest(False)
ob.setAttrib(DepthTestAttrib.make(RenderAttrib.MAlways))
#ob.setRenderModeFilled()

dl1 = Spotlight('a')
lens = PerspectiveLens()
dl1.setLens(lens)
dl1n = app.render.attachNewNode(dl1)
dl1n.setPos(500, -500, -0.1)
dl1n.lookAt(ob)
app.render.setLight(dl1n)

al1 = AmbientLight('al1')
al1n = app.render.attachNewNode(al1)
app.render.setLight(al1n)

pl1 = PointLight('pl1')
pl1n = app.render.attachNewNode(pl1)
pl1n.setPos(0, 0, 60)
app.render.setLight(pl1n)

pl2 = PointLight('pl2')
pl2n = app.render.attachNewNode(pl2)
pl2n.setPos(0, 0, -60)
app.render.setLight(pl2n)

m1 = Material()
m1.setShininess(50)
m1.setAmbient((0.7, 0.7, 0.8, 1))
m1.setDiffuse((0.7, 0.7, 0.8, 1))
m1.setSpecular((0.7, 0.7, 1, 1))

ob.setMaterial(m1)

app.cam.setPos(500, -500, -0.1)
app.cam.lookAt(ob)
    
def rr(task):
    ob.setHpr(20*task.time, 25*task.time, 13*task.time)
    return Task.cont
    
app.taskMgr.add(rr, 'rr')

app.run()

I don’t think you need to change depth read/write just disable backface culling

For the pyramid if you don’t want to see the diagonal on the base - don’t draw those triangles (this might not work for other shapes)

from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
from direct.task import Task
from math import *

vdata = GeomVertexData("vertices", GeomVertexFormat.getV3n3(), Geom.UHStatic)
vdata.setNumRows(18)

k = sqrt(1.0/2)

vertexWriter = GeomVertexWriter(vdata, "vertex")
normalWriter = GeomVertexWriter(vdata, "normal")

#vertexWriter.addData3f(100, -100, -50);  normalWriter.addData3f(0, 0, -1);
#vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, 0, -1);
#vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, 0, -1);

#vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, 0, -1);
#vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(0, 0, -1);
#vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, 0, -1);


vertexWriter.addData3f(100, -100, -50); normalWriter.addData3f(0, -k, k);
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(0, -k, k);
vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(0, -k, k);

vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(k, 0, k);
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(k, 0, k);
vertexWriter.addData3f(100, -100, -50); normalWriter.addData3f(k, 0, k);

vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(0, k, k);
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(0, k, k);
vertexWriter.addData3f(100, 100, -50); normalWriter.addData3f(0, k, k);

vertexWriter.addData3f(-100, 100, -50); normalWriter.addData3f(-k, 0, k);
vertexWriter.addData3f(-100, -100, -50); normalWriter.addData3f(-k, 0, k);
vertexWriter.addData3f(0, 0, 50); normalWriter.addData3f(-k, 0, k);

tris=GeomTriangles(Geom.UHStatic)

tris.setShadeModel(Geom.SM_uniform)

tris.addVertex(0)
tris.addVertex(1)
tris.addVertex(2)
tris.closePrimitive()

tris.addVertex(3)
tris.addVertex(4)
tris.addVertex(5)
tris.closePrimitive()


tris.addVertex(6)
tris.addVertex(7)
tris.addVertex(8)
tris.closePrimitive()

tris.addVertex(9)
tris.addVertex(10)
tris.addVertex(11)
tris.closePrimitive()

tris.addVertex(12)
tris.addVertex(13)
tris.addVertex(14)
tris.closePrimitive()

tris.addVertex(15)
tris.addVertex(16)
tris.addVertex(17)
tris.closePrimitive()

squareGeom=Geom(vdata)
squareGeom.addPrimitive(tris)

squareGN=GeomNode("square")
squareGN.addGeom(squareGeom)

app = ShowBase()
ob = app.render.attachNewNode(squareGN)
ob.setAntialias(AntialiasAttrib.MMultisample)

#ob.node().setAttrib(ShadeModelAttrib.make(ShadeModelAttrib.MSmooth))
#ob.node().setAttrib(ShadeModelAttrib.make(ShadeModelAttrib.MFlat))
ob.setRenderModeWireframe()
ob.setRenderModeThickness(5)
ob.setRenderModePerspective(True)

#ob.setDepthWrite(False)
#ob.setDepthTest(False)
#ob.setAttrib(DepthTestAttrib.make(RenderAttrib.MAlways))
#ob.setRenderModeFilled()

dl1 = Spotlight('a')
lens = PerspectiveLens()
dl1.setLens(lens)
dl1n = app.render.attachNewNode(dl1)
dl1n.setPos(500, -500, -0.1)
dl1n.lookAt(ob)
app.render.setLight(dl1n)

al1 = AmbientLight('al1')
al1n = app.render.attachNewNode(al1)
app.render.setLight(al1n)

pl1 = PointLight('pl1')
pl1n = app.render.attachNewNode(pl1)
pl1n.setPos(0, 0, 60)
app.render.setLight(pl1n)

pl2 = PointLight('pl2')
pl2n = app.render.attachNewNode(pl2)
pl2n.setPos(0, 0, -60)
app.render.setLight(pl2n)

m1 = Material()
m1.setShininess(50)
m1.setAmbient((0.7, 0.7, 0.8, 1))
m1.setDiffuse((0.7, 0.7, 0.8, 1))
m1.setSpecular((0.7, 0.7, 1, 1))

ob.setMaterial(m1)

#ob.setAttrib(CullFaceAttrib.make(CullFaceAttrib.MCullNone)) #this also works but is longer
ob.setTwoSided(True)

app.cam.setPos(500, -500, -0.1)
app.cam.lookAt(ob)

def rr(task):
    ob.setHpr(20*task.time, 25*task.time, 13*task.time)
    return Task.cont

app.taskMgr.add(rr, 'rr')

app.run()

Thanks!

I never guess that this is because the object is not two side drawn.

With your help - its work!

And, if i want to change filled and wireframed mode of body, may be must put the base square in another geom, to hide in wireframe mode… very additional operations, but it is important that work.