diff --git a/src/main/java/labs/introtoprogramming/lab5/Main.java b/src/main/java/labs/introtoprogramming/lab5/Main.java index 1616f55..20cfbe5 100644 --- a/src/main/java/labs/introtoprogramming/lab5/Main.java +++ b/src/main/java/labs/introtoprogramming/lab5/Main.java @@ -7,6 +7,7 @@ import labs.introtoprogramming.lab5.gui.SceneRendererWindow; import labs.introtoprogramming.lab5.scene.Scene; import labs.introtoprogramming.lab5.scene.Camera; +import labs.introtoprogramming.lab5.scene.SceneObject; import labs.introtoprogramming.lab5.scene.Transform; import labs.introtoprogramming.lab5.scenes.DemoScene; @@ -22,9 +23,11 @@ public static void main(String[] args) { private void run() { Scene demoScene = new DemoScene(); + SceneObject empty = new SceneObject(); Camera camera = createCamera(); + camera.getTransform().setParent(empty.getTransform()); demoScene.addSceneObjects(camera); - demoScene.addController(new KeyAndMouseMovementController(camera)); + demoScene.addController(new KeyAndMouseMovementController(empty)); SceneRendererWindow window = new SceneRendererWindow(demoScene); window.setTitle(APP_TILE); diff --git a/src/main/java/labs/introtoprogramming/lab5/scene/BasicRaytracingRender.java b/src/main/java/labs/introtoprogramming/lab5/scene/BasicRaytracingRender.java index 339bece..cda699e 100644 --- a/src/main/java/labs/introtoprogramming/lab5/scene/BasicRaytracingRender.java +++ b/src/main/java/labs/introtoprogramming/lab5/scene/BasicRaytracingRender.java @@ -25,13 +25,14 @@ public BasicRaytracingRender(Raster raster) { @Override public void render(Scene scene) { Camera camera = scene.getCamera().orElseThrow(NoCameraException::new); + Transform transform = camera.getTransform(); Vector3 pos = camera.getTransform().position(); int width = raster.getWidth(); int height = raster.getHeight(); double aspectRatio = camera.aspectRatio(); double fieldOfView = Math.tan(camera.fieldOfView() / 2); Ray primaryRay = new Ray(pos, Vector3.ZERO); - Transform transform = camera.getTransform(); + primaryRay.setOrigin(transform.applyPoint(transform.position())); for (int y = 0; y < height; y++) { double normalizedY = 1 - 2 * (y + 0.5) / height; double cameraY = normalizedY * fieldOfView; @@ -40,7 +41,6 @@ public void render(Scene scene) { double cameraX = normalizedX * aspectRatio * fieldOfView; Vector3 direction = new Vector3(cameraX, cameraY, -1).normalize(); primaryRay.setDirection(transform.applyVector(direction).normalize()); - primaryRay.setOrigin(transform.applyPoint(transform.position())); Color color = getColor(primaryRay, scene); raster.setPixel(x, y, (byte) color.getRed(), diff --git a/src/main/java/labs/introtoprogramming/lab5/scene/Transform.java b/src/main/java/labs/introtoprogramming/lab5/scene/Transform.java index cac53c3..ba1e8bb 100644 --- a/src/main/java/labs/introtoprogramming/lab5/scene/Transform.java +++ b/src/main/java/labs/introtoprogramming/lab5/scene/Transform.java @@ -8,6 +8,7 @@ public class Transform { private Vector3 rotation; private Vector3 scale; private Matrix44 matrix; + private Transform parent; /** * Container of object transformations. @@ -65,6 +66,9 @@ public void setScale(Vector3 scale) { * @return transformed vector to local space */ public Vector3 applyVector(Vector3 v) { + if (parent != null) { + v = parent.applyVector(v); + } return matrix.applyVector(v); } @@ -75,6 +79,9 @@ public Vector3 applyVector(Vector3 v) { * @return transformed point to local space */ public Vector3 applyPoint(Vector3 v) { + if (parent != null) { + v = parent.applyPoint(v); + } return matrix.applyPoint(v); } @@ -89,4 +96,8 @@ public Vector3 applyPoint(Vector3 v) { public void setMatrix(Vector3 right, Vector3 up, Vector3 forward, Vector3 translate) { matrix.setMatrix(right, up, forward, translate); } + + public void setParent(Transform parent) { + this.parent = parent; + } }