
hgkjshegfskef
The Ray Tracer Challenge: cannot pass scaling test (page 69-70)
The test is as follows:
Scenario: Intersecting a scaled sphere with a ray
Given r ← ray(point(0, 0, -5), vector(0, 0, 1))
And s ← sphere()
When set_transform(s, scaling(2, 2, 2))
And xs ← intersect(s, r)
Then xs.count = 2
And xs[0].t = 3
And xs[1].t = 7
However, I get 1.5
and 3.5
respectively.
Looks like I have some misunderstanding about how to do the calculations, because both on paper and in the code I arrive at the same conclusion. So, I will write out my intermediate calculations.
We start by creating a scaling matrix, which is the transformation attached to the sphere:
2 0 0 0
0 2 0 0
0 0 2 0
0 0 0 1
Then we invert it (since we need to transform the ray by the inverse of sphere’s transformation):
0.5 0 0 0
0 0.5 0 0 = F
0 0 0.5 0
0 0 0 1
Then we multiply original ray’s point component with it and get:
0 0
F * 0 = 0
-5 -2.5
Then we multiply original ray’s vector component with it and get:
0 0
F * 0 = 0
1 0.5
So, our new Ray
is { Point(0,0,-2.5), Vector(0,0,0.5) }
, which is a point that lies on Z axis, looking towards the sphere.
To demonstrate that the algorithm for finding intersections between ray and sphere is correct (without writing it out here), we calculate it backwards: we know that the sphere is radius 1, centered at (0,0,0). My intersections are: 1.5
, 3.5
, which are distances from ray origin (-2.5
) to points on the sphere. -2.5 + 1.5 = -1
and -2.5 + 3.5 = 1
, 1 - (-1) = 2
, which is the sphere diameter, so it makes sense? Or does it?
Marked As Solved

jamis
Hey, I’m glad you found a solution! However, I feel like there may be a deeper issue here. The approach described in the book (transforming the ray by the inverse of the sphere’s transformation matrix, and then running the ray/sphere intersection as described) really should have “just worked”. The fact that you got t
values that were half what was expected suggests that at some point maybe you were using the original ray origin/direction somewhere, or perhaps using the wrong transformation matrix?
Ultimately, as long as you’re getting the right answer now, it’s all good. I just worry that you may be doing more work than is necessary to obtain those t
values, which may come back to bite you later in the book when render times grow longer and longer and every computation counts.
I’d be happy to take a look at your code if its available somewhere, if that would be helpful.
Also Liked

hgkjshegfskef
Helo Jamis, thank you for the reply and for the idea for the solution. The problem was with the implementation of quadratic equation solver, in particular, I was normalizing the direction vector of the transformed ray after converting it into object space. Lessons learned: don’t try to be too smart and go to wikipedia to implement line-sphere intersection according to their formula, just implement pseudocode from the book.
Popular Prag Prog topics









Modern Front-End Development for Rails - application does not start after run bin/setup (page xviii)

Other popular topics










Latest in PragProg
Latest (all)
Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /js
- /rails
- /python
- /security
- /go
- /swift
- /vim
- /clojure
- /java
- /haskell
- /emacs
- /svelte
- /onivim
- /typescript
- /crystal
- /c-plus-plus
- /tailwind
- /kotlin
- /gleam
- /react
- /flutter
- /elm
- /ocaml
- /vscode
- /opensuse
- /centos
- /ash
- /php
- /deepseek
- /scala
- /zig
- /html
- /debian
- /nixos
- /lisp
- /agda
- /sublime-text
- /textmate
- /react-native
- /kubuntu
- /arch-linux
- /revery
- /ubuntu
- /manjaro
- /django
- /spring
- /diversity
- /nodejs
- /lua
- /slackware
- /julia
- /c
- /neovim