Java Code Examples for com.jme3.math.Vector3f#cross()

The following examples show how to use com.jme3.math.Vector3f#cross() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: TangentBinormalGenerator.java    From jmonkeyengine with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
public static TriangleData processTriangle(int[] index,
        Vector3f[] v, Vector2f[] t) {
    TempVars tmp = TempVars.get();
    try {
        Vector3f edge1 = tmp.vect1;
        Vector3f edge2 = tmp.vect2;
        Vector2f edge1uv = tmp.vect2d;
        Vector2f edge2uv = tmp.vect2d2;
        
        Vector3f tangent = tmp.vect3;
        Vector3f binormal = tmp.vect4;
        Vector3f normal = tmp.vect5;
        
        t[1].subtract(t[0], edge1uv);
        t[2].subtract(t[0], edge2uv);
        float det = edge1uv.x * edge2uv.y - edge1uv.y * edge2uv.x;
        
        boolean normalize = false;
        if (Math.abs(det) < ZERO_TOLERANCE) {
            log.log(Level.WARNING, "Colinear uv coordinates for triangle "
                    + "[{0}, {1}, {2}]; tex0 = [{3}, {4}], "
                    + "tex1 = [{5}, {6}], tex2 = [{7}, {8}]",
                    new Object[]{index[0], index[1], index[2],
                        t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y});
            det = 1;
            normalize = true;
        }
        
        v[1].subtract(v[0], edge1);
        v[2].subtract(v[0], edge2);
        
        tangent.set(edge1);
        tangent.normalizeLocal();
        binormal.set(edge2);
        binormal.normalizeLocal();
        
        if (Math.abs(Math.abs(tangent.dot(binormal)) - 1)
                < ZERO_TOLERANCE) {
            log.log(Level.WARNING, "Vertices are on the same line "
                    + "for triangle [{0}, {1}, {2}].",
                    new Object[]{index[0], index[1], index[2]});
        }
        
        float factor = 1 / det;
        tangent.x = (edge2uv.y * edge1.x - edge1uv.y * edge2.x) * factor;
        tangent.y = (edge2uv.y * edge1.y - edge1uv.y * edge2.y) * factor;
        tangent.z = (edge2uv.y * edge1.z - edge1uv.y * edge2.z) * factor;
        if (normalize) {
            tangent.normalizeLocal();
        }
        
        binormal.x = (edge1uv.x * edge2.x - edge2uv.x * edge1.x) * factor;
        binormal.y = (edge1uv.x * edge2.y - edge2uv.x * edge1.y) * factor;
        binormal.z = (edge1uv.x * edge2.z - edge2uv.x * edge1.z) * factor;
        if (normalize) {
            binormal.normalizeLocal();
        }
        
        tangent.cross(binormal, normal);
        normal.normalizeLocal();
        
        return new TriangleData(
                tangent.clone(),
                binormal.clone(),
                normal.clone());
    } finally {
        tmp.release();
    }
}
 
Example 2
Source File: SilentTangentBinormalGenerator.java    From OpenRTS with MIT License 4 votes vote down vote up
public static TriangleData processTriangle(int[] index, Vector3f[] v, Vector2f[] t) {
		Vector3f edge1 = new Vector3f();
		Vector3f edge2 = new Vector3f();
		Vector2f edge1uv = new Vector2f();
		Vector2f edge2uv = new Vector2f();

		Vector3f tangent = new Vector3f();
		Vector3f binormal = new Vector3f();
		Vector3f normal = new Vector3f();

		t[1].subtract(t[0], edge1uv);
		t[2].subtract(t[0], edge2uv);
		float det = edge1uv.x * edge2uv.y - edge1uv.y * edge2uv.x;

		boolean normalize = false;
		if (Math.abs(det) < ZERO_TOLERANCE) {
//			log.log(Level.WARNING, "Colinear uv coordinates for triangle " + "[{0}, {1}, {2}]; tex0 = [{3}, {4}], " + "tex1 = [{5}, {6}], tex2 = [{7}, {8}]",
//					new Object[] { index[0], index[1], index[2], t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y });
			det = 1;
			normalize = true;
		}

		v[1].subtract(v[0], edge1);
		v[2].subtract(v[0], edge2);

		tangent.set(edge1);
		tangent.normalizeLocal();
		binormal.set(edge2);
		binormal.normalizeLocal();

		if (Math.abs(Math.abs(tangent.dot(binormal)) - 1) < ZERO_TOLERANCE) {
//			log.log(Level.WARNING, "Vertices are on the same line " + "for triangle [{0}, {1}, {2}].", new Object[] { index[0], index[1], index[2] });
		}

		float factor = 1 / det;
		tangent.x = (edge2uv.y * edge1.x - edge1uv.y * edge2.x) * factor;
		tangent.y = (edge2uv.y * edge1.y - edge1uv.y * edge2.y) * factor;
		tangent.z = (edge2uv.y * edge1.z - edge1uv.y * edge2.z) * factor;
		if (normalize) {
			tangent.normalizeLocal();
		}

		binormal.x = (edge1uv.x * edge2.x - edge2uv.x * edge1.x) * factor;
		binormal.y = (edge1uv.x * edge2.y - edge2uv.x * edge1.y) * factor;
		binormal.z = (edge1uv.x * edge2.z - edge2uv.x * edge1.z) * factor;
		if (normalize) {
			binormal.normalizeLocal();
		}

		tangent.cross(binormal, normal);
		normal.normalizeLocal();

		return new TriangleData(tangent, binormal, normal);
	}
 
Example 3
Source File: TangentBinormalGenerator.java    From MikuMikuStudio with BSD 2-Clause "Simplified" License 4 votes vote down vote up
public static TriangleData processTriangle(int[] index,
        Vector3f[] v, Vector2f[] t)
{
    Vector3f edge1 = new Vector3f();
    Vector3f edge2 = new Vector3f();
    Vector2f edge1uv = new Vector2f();
    Vector2f edge2uv = new Vector2f();

    Vector3f tangent = new Vector3f();
    Vector3f binormal = new Vector3f();
    Vector3f normal = new Vector3f();

    t[1].subtract(t[0], edge1uv);
    t[2].subtract(t[0], edge2uv);
    float det = edge1uv.x*edge2uv.y - edge1uv.y*edge2uv.x;

    boolean normalize = false;
    if (Math.abs(det) < ZERO_TOLERANCE) {
        log.log(Level.WARNING, "Colinear uv coordinates for triangle " +
                "[{0}, {1}, {2}]; tex0 = [{3}, {4}], " +
                "tex1 = [{5}, {6}], tex2 = [{7}, {8}]",
                new Object[]{ index[0], index[1], index[2],
                t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y });
        det = 1;
        normalize = true;
    }

    v[1].subtract(v[0], edge1);
    v[2].subtract(v[0], edge2);

    tangent.set(edge1);
    tangent.normalizeLocal();
    binormal.set(edge2);
    binormal.normalizeLocal();

    if (Math.abs(Math.abs(tangent.dot(binormal)) - 1)
                    < ZERO_TOLERANCE)
    {
        log.log(Level.WARNING, "Vertices are on the same line " +
                "for triangle [{0}, {1}, {2}].",
                new Object[]{ index[0], index[1], index[2] });
    }

    float factor = 1/det;
    tangent.x = (edge2uv.y*edge1.x - edge1uv.y*edge2.x)*factor;
    tangent.y = (edge2uv.y*edge1.y - edge1uv.y*edge2.y)*factor;
    tangent.z = (edge2uv.y*edge1.z - edge1uv.y*edge2.z)*factor;
    if (normalize) tangent.normalizeLocal();

    binormal.x = (edge1uv.x*edge2.x - edge2uv.x*edge1.x)*factor;
    binormal.y = (edge1uv.x*edge2.y - edge2uv.x*edge1.y)*factor;
    binormal.z = (edge1uv.x*edge2.z - edge2uv.x*edge1.z)*factor;
    if (normalize) binormal.normalizeLocal();

    tangent.cross(binormal, normal);
    normal.normalizeLocal();

    return new TriangleData(
                    tangent,
                    binormal,
                    normal,
                    index[0], index[1], index[2]
                );
}