Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   need help with normals (http://www.velocityreviews.com/forums/t688965-need-help-with-normals.html)

 Thorsten Kiefer 06-24-2009 02:52 PM

need help with normals

Hi,
I wrote normal calculator for IndexTriangleFanStrip, but it calculates
partially wrong normals, can anyone help me with that ?

public static Vector3f[] computeNormals(Point3f[] coords, int[]
coordIndices, int[] stripCounts) {
Vector3f[] normals = new Vector3f[coords.length];
for (int i = 0; i < normals.length; ++i) {
normals[i] = new Vector3f();
}
Vector3f[] coordVs = new Vector3f[coords.length];
for (int i = 0; i < coordVs.length; ++i) {
coordVs[i] = new Vector3f(coords[i]);
}

int stripStart = 0;
for (int i = 0; i < stripCounts.length; ++i) {
Vector3f x0 = coordVs[coordIndices[stripStart]];
for (int j = 2; j < stripCounts[i]; ++j) {
Vector3f x1 = coordVs[coordIndices[stripStart + j]];
Vector3f x2 = coordVs[coordIndices[stripStart + j - 1]];
Vector3f d1 = new Vector3f();
Vector3f d2 = new Vector3f();
Vector3f cp = new Vector3f();
d1.sub(x1, x0);
d2.sub(x2, x0);
cp.cross(d1, d2);
}
stripStart += stripCounts[i];
}

for (int i = 0; i < normals.length; ++i) {
normals[i].normalize();
}

return normals;
}

Best Wishes
Thorsten

 Daniel Pitts 06-24-2009 07:15 PM

Re: need help with normals

Thorsten Kiefer wrote:
> Hi,
> I wrote normal calculator for IndexTriangleFanStrip, but it calculates
> partially wrong normals, can anyone help me with that ?
>
> public static Vector3f[] computeNormals(Point3f[] coords, int[]
> coordIndices, int[] stripCounts) {
> Vector3f[] normals = new Vector3f[coords.length];
> for (int i = 0; i < normals.length; ++i) {
> normals[i] = new Vector3f();
> }
> Vector3f[] coordVs = new Vector3f[coords.length];
> for (int i = 0; i < coordVs.length; ++i) {
> coordVs[i] = new Vector3f(coords[i]);
> }
>
> int stripStart = 0;
> for (int i = 0; i < stripCounts.length; ++i) {
> Vector3f x0 = coordVs[coordIndices[stripStart]];
> for (int j = 2; j < stripCounts[i]; ++j) {
> Vector3f x1 = coordVs[coordIndices[stripStart + j]];
> Vector3f x2 = coordVs[coordIndices[stripStart + j - 1]];
> Vector3f d1 = new Vector3f();
> Vector3f d2 = new Vector3f();
> Vector3f cp = new Vector3f();
> d1.sub(x1, x0);
> d2.sub(x2, x0);
> cp.cross(d1, d2);
> normals[coordIndices[stripStart + j - 1]].add(cp);
> }
> stripStart += stripCounts[i];
> }
>
> for (int i = 0; i < normals.length; ++i) {
> normals[i].normalize();
> }
>
> return normals;
> }
>
>
> Best Wishes
> Thorsten
>

Please provide an SSCCE. Actually, it would be even better in this case
to provide a Unit Test, complete with assertEqual statements that show
what values you are expecting, but not getting.

Either way, it must be stand-alone compilable and easily runnable (I
consider JUnit tests to be easily runnable, as well as standard "main"
methods)

--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>

 John B. Matthews 06-25-2009 01:19 AM

Re: need help with normals

Daniel Pitts <newsgroup.spamfilter@virtualinfinity.net> wrote:

> Thorsten Kiefer wrote:
> > I wrote normal calculator for IndexTriangleFanStrip, but it calculates
> > partially wrong normals, can anyone help me with that ?
> >

[...]
>
> Please provide an SSCCE. Actually, it would be even better in this
> case to provide a Unit Test, complete with assertEqual statements
> that show what values you are expecting, but not getting.
>
> Either way, it must be stand-alone compilable and easily runnable (I
> consider JUnit tests to be easily runnable, as well as standard
> "main" methods)

I'd be interested, too. Here's an example using the JScience library:

<http://jscience.org/api/index.html>

<code>
import junit.framework.Assert;
import org.jscience.mathematics.vector.Float64Vector;
import org.junit.Test;

public class VectorCrossTest {

private static final double EPSILON = 1e-15;

@Test
public void testMain() {
System.out.println("testing...");
Float64Vector v1 = Float64Vector.valueOf(1, 0, 0);
Float64Vector v2 = Float64Vector.valueOf(0, 1, 0);
check(v1.cross(v2), 0, 0, 1);
check(v2.cross(v1), 0, 0, -1);
check(v1.cross(v2).cross(v1), 0, 1, 0);
}

private void check (Float64Vector v, double... values) {
System.out.println(v);
for (int i = 0 ; i < v.getDimension(); i++ ) {
Assert.assertEquals(v.getValue(i), values[i], EPSILON);
}
}
}
</code>

--
John B. Matthews
trashgod at gmail dot com

 Thorsten Kiefer 06-25-2009 12:44 PM

Re: need help with normals

John B. Matthews wrote:

> Daniel Pitts <newsgroup.spamfilter@virtualinfinity.net> wrote:
>
>> Thorsten Kiefer wrote:
>> > I wrote normal calculator for IndexTriangleFanStrip, but it calculates
>> > partially wrong normals, can anyone help me with that ?
>> >

> [...]
>>
>> Please provide an SSCCE. Actually, it would be even better in this
>> case to provide a Unit Test, complete with assertEqual statements
>> that show what values you are expecting, but not getting.
>>
>> Either way, it must be stand-alone compilable and easily runnable (I
>> consider JUnit tests to be easily runnable, as well as standard
>> "main" methods)

>
> I'd be interested, too. Here's an example using the JScience library:
>
> <http://jscience.org/api/index.html>
>
> <code>
> import junit.framework.Assert;
> import org.jscience.mathematics.vector.Float64Vector;
> import org.junit.Test;
>
> public class VectorCrossTest {
>
> private static final double EPSILON = 1e-15;
>
> @Test
> public void testMain() {
> System.out.println("testing...");
> Float64Vector v1 = Float64Vector.valueOf(1, 0, 0);
> Float64Vector v2 = Float64Vector.valueOf(0, 1, 0);
> check(v1.cross(v2), 0, 0, 1);
> check(v2.cross(v1), 0, 0, -1);
> check(v1.cross(v2).cross(v1), 0, 1, 0);
> }
>
> private void check (Float64Vector v, double... values) {
> System.out.println(v);
> for (int i = 0 ; i < v.getDimension(); i++ ) {
> Assert.assertEquals(v.getValue(i), values[i], EPSILON);
> }
> }
> }
> </code>
>

OK I think i found the problem, I'm confused.
In an IndexedTriangleFanStrip are the normals supplied per Vertex
or per Index ? e.g a cube has 8 Vertices, but 24 indices with 4 indices per
Triangle Fan -> 6 Fans (6 polys).
Now do I have to compute 8 Normals or 24 ???

tk

 Thorsten Kiefer 06-25-2009 02:23 PM

Re: need help with normals

Thorsten Kiefer wrote:

> John B. Matthews wrote:
>
>> Daniel Pitts <newsgroup.spamfilter@virtualinfinity.net> wrote:
>>
>>> Thorsten Kiefer wrote:
>>> > I wrote normal calculator for IndexTriangleFanStrip, but it calculates
>>> > partially wrong normals, can anyone help me with that ?
>>> >

>> [...]
>>>
>>> Please provide an SSCCE. Actually, it would be even better in this
>>> case to provide a Unit Test, complete with assertEqual statements
>>> that show what values you are expecting, but not getting.
>>>
>>> Either way, it must be stand-alone compilable and easily runnable (I
>>> consider JUnit tests to be easily runnable, as well as standard
>>> "main" methods)

>>
>> I'd be interested, too. Here's an example using the JScience library:
>>
>> <http://jscience.org/api/index.html>
>>
>> <code>
>> import junit.framework.Assert;
>> import org.jscience.mathematics.vector.Float64Vector;
>> import org.junit.Test;
>>
>> public class VectorCrossTest {
>>
>> private static final double EPSILON = 1e-15;
>>
>> @Test
>> public void testMain() {
>> System.out.println("testing...");
>> Float64Vector v1 = Float64Vector.valueOf(1, 0, 0);
>> Float64Vector v2 = Float64Vector.valueOf(0, 1, 0);
>> check(v1.cross(v2), 0, 0, 1);
>> check(v2.cross(v1), 0, 0, -1);
>> check(v1.cross(v2).cross(v1), 0, 1, 0);
>> }
>>
>> private void check (Float64Vector v, double... values) {
>> System.out.println(v);
>> for (int i = 0 ; i < v.getDimension(); i++ ) {
>> Assert.assertEquals(v.getValue(i), values[i], EPSILON);
>> }
>> }
>> }
>> </code>
>>

>
> OK I think i found the problem, I'm confused.
> In an IndexedTriangleFanStrip are the normals supplied per Vertex
> or per Index ? e.g a cube has 8 Vertices, but 24 indices with 4 indices
> per Triangle Fan -> 6 Fans (6 polys).
> Now do I have to compute 8 Normals or 24 ???
>
> tk

Hi,
One can have arbitrarily many normals. It's just important to
connect the right normal to the right vertex index. In deed I use
smooth normals, so I just compute as many normals as there are
vertices. My first mistake was that I didn't normalize the
weighting (do you know what i mean ?). My second mistake
was that I didn't connect the right vertex index to the right
normal index. I fixed this, and now it works fine.
Are you interested in a X3D loader for Java, which supports http ?
I wrote a pretty primitive one (no textures supported).

Regards
Thorsten

 John B. Matthews 06-25-2009 03:30 PM

Re: need help with normals

Thorsten Kiefer <cylinder@news.cnntp.org> wrote:

[...]
> One can have arbitrarily many normals. It's just important to connect
> the right normal to the right vertex index. In deed I use smooth
> normals, so I just compute as many normals as there are vertices. My
> first mistake was that I didn't normalize the cross product before
> adding, which lead to useless normal weighting (do you know what i
> mean ?). My second mistake was that I didn't connect the right vertex
> index to the right normal index. I fixed this, and now it works fine.
> Are you interested in a X3D loader for Java, which supports http ? I
> wrote a pretty primitive one (no textures supported).

Sorry, I have no knowledge of IndexedTriangleFanStrip, but I was curious
about rendering a mesh of trigons in 3D using Java. I'd be grateful for

The last tool I used for this had a convenient feature that calculated
the normal vector on the fly. It assumed a consistent ordering of the
vertices: left-handed v. right-handed. The trick was finding the few odd
triangles that had gotten flipped at the source.

--
John B. Matthews
trashgod at gmail dot com