PolygonMesh behavior
-
@mitcorb said:
Pardon my eavesdropping, but exactly how would I visualize a vertex normal? I can visualize a face normal, even an edge normal under some conditions. Or is it sort of like a tesseract?
I did that for Vertex Tools, I take the average normal of the faces connected to the vertex.
-
@thomthom said:
I did that for Vertex Tools, I take the average normal of the faces connected to the vertex.
You're missing a step with your averaging there. You need to weight by the contribution each face connected to the vertex makes - ie weight by the interior angle otherwise a cube constructed of triangles will end up with vertex normals not all pointing out exactly at 45 degrees.
-
I am sorry but I use this topic because it seems to be about my question.
I make a solid using the help example for smooth surfaces (6 sides), then I push for the elevation, then I select all the object, then I apply Soften edges angle 79,0 degrees, and the edge appear soft.
But if I get the normals at each point I read always (0, 0, 0), that is not a valid vector.
Sorry, where I am wrong?for np in 1..numpol do vertices=mesh.polygon_at np numvrtx=vertices.length - 1 for eachvrtx in 0..numvrtx do x = mesh.point_at((vertices[eachvrtx]).abs).x*RatioPov y = mesh.point_at((vertices[eachvrtx]).abs).y*RatioPov z = mesh.point_at((vertices[eachvrtx]).abs).z*RatioPov nx = mesh.normal_at (eachvrtx+1) #index is base 1 UI.messagebox(nx.to_s)
-
@soldatino said:
I make a solid using the help example for smooth surfaces (6 sides
Which example?
@soldatino said:
But if I get the normals at each point
I think that
.normal_at( index )
refer to the normal of a polygon - not point... -
http://code.google.com/intl/it/apis/sketchup/docs/ourdoc/polygonmesh.html#normal_at
but this is about points "particular index in the mesh."
Or it is for each face? In this case I have to calculate each angle between vertexes of adjacent faces?
Anyway the vector that I get is 0,0,0, but the faces have smooting in SU.
http://sketchup.google.com/support/bin/answer.py?hl=it&answer=114941
the procedure is explained in the yellow window.. -
I think "particular index in the mesh." refer to the index of polygons.
@soldatino said:
Anyway the vector that I get is 0,0,0, but the faces have smooting in SU.
Normals in SketchUp does not relate the smoothing. Normals are always perpendicular to the face/polygon.
To find out of the mesh has smooth edges use
PolygonMesh.polygon_at
http://code.google.com/intl/it/apis/sketchup/docs/ourdoc/polygonmesh.html#polygon_at orPolygonMesh.polygons
http://code.google.com/intl/it/apis/sketchup/docs/ourdoc/polygonmesh.html#polygons -
yes, thanks, pointing at the face I get the float values of the vector.
Now if it is a offset valid for all the points of each face, I have to find the common points of adjacent faces, and interpolate their offsets to get the vector for the points. A lot of work... do yo think it is right? -
Think so - SU doesn't provide vertex normals.
When I wrote Vertex Tools I have to work them out manually from the connected faces. -
Look at a vertex.
Get its faces.
Get the normals of the faces [lets say there are 3 of them].
Combine the faces' normals [vectors] using v = v1 + v2 + v3
Now 'v' should be the combined-vector at that vertex [the vertex-normal?]...
Test it usingentities.add_line(vertex.position,v.to_a)
which should draw a line at the vertex along the direction of the combined-vector 'v'... -
thomthom, TIG, thanks. I will attempt to write this in Ruby, even if I dont know much of this language, to do it with a post editor would be very easy, storing the array of all the normals of every face as comments within the ouput of the points ...
note: Vertex.used_by? in a loop of all connected faces ? waiting for the eternity...
-
@soldatino said:
note: Vertex.used_by? in a loop of all connected faces ? waiting for the eternity...
-
@thomthom said:
@soldatino said:
note: Vertex.used_by? in a loop of all connected faces ? waiting for the eternity...
I am worried because I think that with large model the time required will be huge.
Addictionally I would not repeat the calculation for the same point when the loop scans the already involved faces, but if I do not want to repeat I have to save an array for all the entities, containing normals already calculated, and to scan it also, which could be worse... -
What are you doing? An exporter?
-
<span class="syntaxdefault"><br /> </span><span class="syntaxkeyword">for </span><span class="syntaxdefault">eachvrtx in 0.</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">numvrtx </span><span class="syntaxkeyword">do<br /> </span><span class="syntaxdefault">x </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">mesh</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">point_at</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">eachvrtx</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">abs</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /> y </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">mesh</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">point_at</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">eachvrtx</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">abs</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /> z </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">mesh</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">point_at</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">eachvrtx</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">abs</span><span class="syntaxkeyword">).</span><span class="syntaxdefault">z</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /></span>
Change into this
<span class="syntaxdefault"><br /> </span><span class="syntaxkeyword">for </span><span class="syntaxdefault">eachvrtx in 0.</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">numvrtx </span><span class="syntaxkeyword">do<br /> </span><span class="syntaxdefault">pt </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">mesh</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">point_at</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">vertices</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">eachvrtx</span><span class="syntaxkeyword">]).</span><span class="syntaxdefault">abs</span><span class="syntaxkeyword">)<br /> </span><span class="syntaxdefault">x </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">pt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">x</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /> y </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">pt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">y</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /> z </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">pt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">z</span><span class="syntaxkeyword">*</span><span class="syntaxdefault">RatioPov<br /></span>
Should be a little bit faster.
-
This is a part of my exporter to POV-Ray. Yes, now I apply your suggestion !
-
17/11/2010 10:03:00
//Ending at 17/11/2010 10:03:1817/11/2010 10:09:00
//Ending at 17/11/2010 10:09:1828935 faces
Later I will check on largest files... -
@thomthom said:
Think so - SU doesn't provide vertex normals.
You are wrong Thomas!
Check this :
polygonmesh.normal_at(vertex_index)
Soldatino, your exporter will work faster now
I think that is what you have been looking for, unless you want to do vertex welding. -
@unknownuser said:
@thomthom said:
Think so - SU doesn't provide vertex normals.
You are wrong Thomas!
Check this :
polygonmesh.normal_at(vertex_index)
?
From the docs I see nothing that indicate vertex index. http://code.google.com/apis/sketchup/docs/ourdoc/polygonmesh.html#normal_at
Saying that - it doesn't even say if it's polygon index.Tomaz: you got a working example?
-
@thomthom said:
Toma**s**z: you got a working example?
Yep. SU2TH
You have to extract a triangle indexes using
tri_indexes=polygonmesh.polygon_at(mesh_index)
and then
normal0=tri.normal_at(tri_indexes[0]) normal1=tri.normal_at(tri_indexes[1]) normal2=tri.normal_at(tri_indexes[2])
The docs are .... terribly bad, you know that you can't rely on them
Now you know how to use it and speed-up your plugins.
EDITED. I was terribly wrong It is correct now.
-
I can't get it working...
Advertisement