Thanks!

Actually, now that I think about it something like this would be really 
helpful, and probably make more sense:
Maybe a version of point-at that would let you specify which pos’s should match 
up where?

(my-point-at v1 v2 v3 v4 #:normalize? #f)   ; maps v1 to v3 and v2 to v4
(my-point-at (pos 0 0 0) (pos 1 0 0) v1 v2 #:normalize? #f)   ; maps the origin 
to v1, and (pos 1 0 0) to v2.
(my-point-at (pos 0 0 0) (pos 0 0 1) v1 v2)   ; equivalent to (point-at v1 v2)
(my-point-at v1 dv1 v2 dv2)   ; equivalent to (my-point-at v1 (pos+ v1 dv1) v2 
(pos+ v2 dv2))

On Mar 15, 2015, at 5:58 PM, Neil Toronto <neil.toro...@gmail.com> wrote:

> On 03/15/2015 04:54 PM, Alexander D. Knauth wrote:
>> 
>> On Mar 14, 2015, at 11:51 PM, Neil Toronto <neil.toro...@gmail.com> wrote:
>> 
>>> What you need is to 1) create and combine the necessary Pict3Ds as much as 
>>> possible before the game starts; and 2) reuse them as much as possible 
>>> during the game.
>>> 
>>> You can even make the reused Pict3Ds fairly large if you freeze them. Any 
>>> modern 3D card won't have any problem with this, for example:
>>> 
>>>  (freeze (combine (get-tube+obstacles (make-world-stream) +x 1000)))
>>> 
>>> Freezing takes a while, though, and has this annoying property that it 
>>> takes the most time the first time the frozen Pict3D is rendered. (The 
>>> actual freezing has to be done with an active OpenGL context.) I'm not sure 
>>> what to do about the latter problem.
>> 
>> If I made it a finite game, with a finite tube, I could probably generate 
>> the whole tube once and move the camera along it, but with an infinite lazy 
>> tube, I’m not sure how I can reuse it.
> 
> I'd generate a few different kinds of segments and then transform them into 
> place. Don't use `rotate` for that, though - there's an easier way.
> 
> Transforming a shape is pretty fast. Here's an insane example, using many 
> more segments for a cylinder than you'd normally ever need:
> 
> 
> #lang racket
> 
> (require pict3d)
> 
> (define v1 (pos 1 1 1))
> (define v2 (pos 2 3 2))
> (define cyl
>  (time
>   (with-color (rgba "lightblue")
>     ;; WOO 65536 TRIANGLES YEAH
>     (move-z (cylinder origin (dir 1/4 1/4 1/2) #:segments 16384)
>             1/2))))
> 
> (define pict
>  (time
>   (combine (sphere v1 0.2)
>            (sphere v2 0.2)
>            (transform cyl (point-at v1 v2 #:normalize? #f)))))
> 
> (time (pict3d->bitmap pict))
> (time (pict3d->bitmap pict))
> 
> 
> On my computer, creating `cyl` takes 5 seconds. Transforming it takes no 
> measurable time. Rendering it the first time takes 1.5 seconds, and rendering 
> it the second time takes 11 milliseconds. (Cylinders are frozen, so they'll 
> always render faster the second time.)
> 
> To stretch the cylinder between two points, the program
> 
> 1. Creates the cylinder so that its bottom is at the origin and its
>    top is at (pos 0 0 1).
> 
> 2. Uses `point-at` without normalization to move the origin to `v1` and
>    move (pos 0 0 1) to `v2`.
> 
> Based on this and your other feedback, I think Pict3D needs
> 
> * A `rotate-around` function that rotates a shape around a given point
>   (with the default being the center of its bounding box).
> 
> * A note in the docs for `rotate` et al that explain they rotate around
>   the origin.
> 
> * A "How Do I" section that includes things like the above example.
> 
> * Notes in the docs about performance characteristics of different
>   functions (e.g. that `cylinder` and `cone` return frozen Pict3Ds, and
>   what that means you can expect from them).
> 
> I expect performance characteristics to change, though, so that last one 
> might be late coming.
> 
> Neil ⊥
> 


____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to