PolygonMesh behavior
-
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...
-
Do not count_points, count_polygons instead.
1 .. mesh.count_polygons
then{ tri_indexes=mesh.polygon_at(i) (0..2).each{|q| p mesh.normal_at(tri_indexes[q])} }
EDIT.
usemesh 7
to ensure you get also normals. Doc doesn't say what is a default flag. -
But when you do
1 .. mesh.count_polygons
you iterate over the polygons. Andmesh.polygon_at(i)
returns an array of point (vertex) indexes - which are the same indexes you get when you iterate mesh.count_points...??
-
@unknownuser said:
EDIT.
usemesh 7
to ensure you get also normals. Doc doesn't say what is a default flag.Ah! Yes - of course. Now I get normals.
-
Correct. They are same indexes, but now they define a triangle. In exporter you usually export triangles not a cloud of points...
Have you used mesh(7)? Maybe this is why it returns Vector3d(0,0,0) instead of Vector3d(0,-1,0)?
-
@unknownuser said:
Have you used mesh(7)? Maybe this is why it returns Vector3d(0,0,0) instead of Vector3d(0,-1,0)?
Ja - it worked then. I'm guessing that was the same reason Soldatino got 0,0,0 normals as well.
-
Thanks Tomasz and others!
Wow, I was away some time!
It seems it is possible, even if my english is terrible I think to understand something...
thomthom, exactly I had the same your results...About the
x = mesh.point_at((vertices[eachvrtx]).abs).xRatioPov
Y = mesh.point_at((vertices[eachvrtx]).abs).yRatioPov
z = mesh.point_at((vertices[eachvrtx]).abs).z*RatioPov
instead ofpt = mesh.point_at((vertices[eachvrtx]).abs)
x = pt.x*RatioPov
y = pt.y*RatioPov
z = pt.z*RatioPov
I cannot confirm the better time of the second way... I understand that it seems impossible but my tests are different...
If I dont resolve I will send you my entire code of the plugin... -
@soldatino said:
I cannot confirm the better time of the second way.
It was just a general suggestion. When I was doing Vertex Tools I spend quite some time looking at performance - and when you do lots of iterations you can some times save some time by avoiding doing multiple lookups.
But overall gain will depend on what else your code is - there could be parts that offsets the performance gain too much.
If you want you can PM me the code and I can have a look at it. -
@thomthom said:
@soldatino said:
I cannot confirm the better time of the second way.
It was just a general suggestion. When I was doing Vertex Tools I spend quite some time looking at performance - and when you do lots of iterations you can some times save some time by avoiding doing multiple lookups.
But overall gain will depend on what else your code is - there could be parts that offsets the performance gain too much.
If you want you can PM me the code and I can have a look at it.Yes I do!
HI, the normals are workin ! With flag 7 I got them !
The code is the output for POV-Ray (the normals are as // NOTE at this moment...)
triangle{<1.0,0.0,1.0><0.0,0.0,0.0><0.0,0.0,1.0>
// normal (0.0, 0.0, -1.0)
pigment{color rgb 1} finish{SkUpLight}}
triangle{<0.0,0.0,0.0><1.0,0.0,1.0><1.0,0.0,0.0>
// normal (0.0, 0.0, -1.0)
pigment{color rgb 1} finish{SkUpLight}}
triangle{<1.0,1.0,0.0><0.0,1.0,1.0><0.0,1.0,0.0>
// normal (0.0, 0.0, 1.0)
pigment{color rgb 1} finish{SkUpLight}}
triangle{<0.0,1.0,1.0><1.0,1.0,0.0><1.0,1.0,1.0>
// normal (0.0, 0.0, 1.0)
pigment{color rgb 1} finish{SkUpLight}}
triangle{<0.0,1.0,1.0><0.0,0.0,0.0><0.0,1.0,0.0>
// normal (-1.0, 0.0, 0.0)
pigment{color rgb 1} finish{SkUpLight}}
triangle{<0.0,0.0,0.0><0.0,1.0,1.0><0.0,0.0,1.0>
// normal (-1.0, 0.0, 0.0)
pigment{color rgb 1} finish{SkUpLight}}
Advertisement