You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
3.4 KiB
70 lines
3.4 KiB
import Ray from "../src/05/ray";
|
|
import Camera from "../src/05/camera";
|
|
|
|
import { assert, expect } from 'chai';
|
|
import { GroupNode, SphereNode } from "../src/08/nodes";
|
|
import { Translation, Rotation } from "../src/08/transformation";
|
|
import Vector from "../src/05/vector";
|
|
import Sphere from "../src/05/sphere";
|
|
import Intersection from "../src/05/intersection";
|
|
import { Traversal } from "../src/08/traversal";
|
|
|
|
describe('Traversal', () => {
|
|
|
|
it('Moved & rotated SphereNode can be intersected correctly', () => {
|
|
let t: GroupNode = new GroupNode(new Translation(new Vector(0.0, 0.0, -5.0, 0.0)));
|
|
let r: GroupNode = new GroupNode(new Rotation(new Vector(0.0, 1.0, 0.0, 0.0), Math.PI / 180 * 90));
|
|
t.add(r);
|
|
|
|
let s: SphereNode = new SphereNode(new Translation(new Vector(0.0, 0.0, 0.0, 0.0)), new Vector(0.0, 0.0, 0.0, 0.0));
|
|
r.add(s);
|
|
|
|
let ray: Ray = new Ray(new Vector(0.0, 0.0, 0.0, 1.0), new Vector(0.0, 0.0, -1.0, 0.0));
|
|
|
|
let intersection = new Array<Intersection>();
|
|
let intersectionObjects = new Array<SphereNode>();
|
|
Traversal.traverse(t, ray, t.transform, intersection, intersectionObjects);
|
|
|
|
// rotation should not move sphere
|
|
expect(intersection.length).to.equal(1);
|
|
expect(intersection[0].point.x).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.y).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.z).to.be.closeTo(-4, 0.00001);
|
|
expect(intersection[0].point.w).to.be.closeTo(1, 0.00001);
|
|
|
|
r.children.pop();
|
|
let s1: SphereNode = new SphereNode(new Translation(new Vector(1.0, 0.0, 0.0, 0.0)), new Vector(0.0, 0.0, 0.0, 0.0));
|
|
r.add(s1);
|
|
intersection = new Array<Intersection>();
|
|
intersectionObjects = new Array<SphereNode>();
|
|
Traversal.traverse(t, ray, t.transform, intersection, intersectionObjects);
|
|
|
|
// rotating 90° around y and translating in x direction should move in z direction
|
|
expect(intersection.length).to.equal(1);
|
|
expect(intersection[0].point.x).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.y).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.z).to.be.closeTo(-5, 0.00001);
|
|
expect(intersection[0].point.w).to.be.closeTo(1, 0.00001);
|
|
|
|
t.children.pop();
|
|
r = new GroupNode(new Rotation(new Vector(0.0, 0.0, 1.0, 0.0), Math.PI / 180 * 90));
|
|
t.add(r);
|
|
|
|
let s2 = new SphereNode(new Translation(new Vector(0.999999999999, 0.0, 0.0, 0.0)), new Vector(0.0, 0.0, 0.0, 0.0));
|
|
r.add(s2);
|
|
intersection = new Array<Intersection>();
|
|
intersectionObjects = new Array<SphereNode>();
|
|
Traversal.traverse(t, ray, t.transform, intersection, intersectionObjects);
|
|
|
|
// rotating 90° around z and translating in x direction should move in y direction
|
|
expect(intersection.length).to.equal(1);
|
|
expect(intersection[0].point.x).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.y).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].point.z).to.be.closeTo(-5, 0.00001);
|
|
expect(intersection[0].point.w).to.be.closeTo(1, 0.00001);
|
|
expect(intersection[0].normal.x).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].normal.y).to.be.closeTo(-1, 0.00001);
|
|
expect(intersection[0].normal.z).to.be.closeTo(0, 0.00001);
|
|
expect(intersection[0].normal.w).to.be.closeTo(0, 0.00001);
|
|
});
|
|
});
|