Mercurial > cortex
comparison org/eyes.org @ 23:cab2da252494
split off the rest of cortex.org
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sun, 23 Oct 2011 23:54:26 -0700 |
parents | |
children | e965675ec4d0 |
comparison
equal
deleted
inserted
replaced
22:157b416152ea | 23:cab2da252494 |
---|---|
1 #+title: Eyes | |
2 #+author: Robert McIntyre | |
3 #+email: rlm@mit.edu | |
4 #+description: Simulating senses for AI research using JMonkeyEngine3 | |
5 #+SETUPFILE: ../../aurellem/org/setup.org | |
6 #+INCLUDE: ../../aurellem/org/level-0.org | |
7 #+babel: :mkdirp yes :noweb yes :exports both | |
8 | |
9 | |
10 | |
11 ** Eyes | |
12 | |
13 Ultimately I want to make creatures with eyes. Each eye can be | |
14 independely moved and should see its own version of the world | |
15 depending on where it is. | |
16 #+srcname: eyes | |
17 #+begin_src clojure | |
18 (ns body.eye) | |
19 (use 'cortex.world) | |
20 (use 'cortex.import) | |
21 (use 'clojure.contrib.def) | |
22 (cortex.import/mega-import-jme3) | |
23 (rlm.rlm-commands/help) | |
24 (import java.nio.ByteBuffer) | |
25 (import java.awt.image.BufferedImage) | |
26 (import java.awt.Color) | |
27 (import java.awt.Dimension) | |
28 (import java.awt.Graphics) | |
29 (import java.awt.Graphics2D) | |
30 (import java.awt.event.WindowAdapter) | |
31 (import java.awt.event.WindowEvent) | |
32 (import java.awt.image.BufferedImage) | |
33 (import java.nio.ByteBuffer) | |
34 (import javax.swing.JFrame) | |
35 (import javax.swing.JPanel) | |
36 (import javax.swing.SwingUtilities) | |
37 (import javax.swing.ImageIcon) | |
38 (import javax.swing.JOptionPane) | |
39 (import java.awt.image.ImageObserver) | |
40 | |
41 | |
42 | |
43 (defn scene-processor | |
44 "deals with converting FrameBuffers to BufferedImages so | |
45 that the continuation function can be defined only in terms | |
46 of what it does with BufferedImages" | |
47 [continuation] | |
48 (let [byte-buffer (atom nil) | |
49 renderer (atom nil) | |
50 image (atom nil)] | |
51 (proxy [SceneProcessor] [] | |
52 (initialize | |
53 [renderManager viewPort] | |
54 (let [cam (.getCamera viewPort) | |
55 width (.getWidth cam) | |
56 height (.getHeight cam)] | |
57 (reset! renderer (.getRenderer renderManager)) | |
58 (reset! byte-buffer | |
59 (BufferUtils/createByteBuffer | |
60 (* width height 4))) | |
61 (reset! image (BufferedImage. width height | |
62 BufferedImage/TYPE_4BYTE_ABGR)))) | |
63 (isInitialized [] (not (nil? @byte-buffer))) | |
64 (reshape [_ _ _]) | |
65 (preFrame [_]) | |
66 (postQueue [_]) | |
67 (postFrame | |
68 [#^FrameBuffer fb] | |
69 (.clear @byte-buffer) | |
70 (.readFrameBuffer @renderer fb @byte-buffer) | |
71 (Screenshots/convertScreenShot @byte-buffer @image) | |
72 (continuation @image)) | |
73 (cleanup [])))) | |
74 | |
75 (defn add-eye | |
76 "Add an eye to the world, and call continuation on | |
77 every frame produced" | |
78 [world camera continuation] | |
79 (let [width (.getWidth camera) | |
80 height (.getHeight camera) | |
81 render-manager (.getRenderManager world) | |
82 viewport (.createMainView render-manager "eye-view" camera)] | |
83 (doto viewport | |
84 (.setBackgroundColor ColorRGBA/Black) | |
85 (.setClearFlags true true true) | |
86 (.addProcessor (scene-processor continuation)) | |
87 (.attachScene (.getRootNode world))))) | |
88 | |
89 (defn make-display-frame [display width height] | |
90 (SwingUtilities/invokeLater | |
91 (fn [] | |
92 (.setPreferredSize display (Dimension. width height)) | |
93 (doto (JFrame. "Eye Camera!") | |
94 (-> (.getContentPane) (.add display)) | |
95 (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE) | |
96 (.pack) | |
97 (.setLocationRelativeTo nil) | |
98 (.setResizable false) | |
99 (.setVisible true))))) | |
100 | |
101 (defn image-monitor [#^BufferedImage image] | |
102 (proxy [JPanel] [] | |
103 (paintComponent | |
104 [g] | |
105 (proxy-super paintComponent g) | |
106 (locking image | |
107 (.drawImage g image 0 0 | |
108 (proxy [ImageObserver] | |
109 [] | |
110 (imageUpdate | |
111 [] | |
112 (proxy-super imageUpdate)))))))) | |
113 | |
114 (defn movie-image [] | |
115 (let [setup | |
116 (runonce | |
117 (fn [#^BufferedImage image] | |
118 (let [width (.getWidth image) | |
119 height (.getHeight image) | |
120 display (image-monitor image) | |
121 frame (make-display-frame display width height)] | |
122 display)))] | |
123 (fn [#^BufferedImage image] | |
124 (.repaint (setup image))))) | |
125 | |
126 | |
127 (defn observer | |
128 "place thy eye!" | |
129 [world camera] | |
130 (let [eye camera | |
131 width (.getWidth eye) | |
132 height (.getHeight eye)] | |
133 (no-exceptions | |
134 (add-eye | |
135 world | |
136 eye | |
137 (movie-image))))) | |
138 #+end_src | |
139 | |
140 #+srcname: test-vision | |
141 #+begin_src clojure | |
142 | |
143 (ns test.vision) | |
144 (use 'cortex.world) | |
145 (use 'cortex.import) | |
146 (use 'clojure.contrib.def) | |
147 (use 'body.eye) | |
148 (cortex.import/mega-import-jme3) | |
149 (rlm.rlm-commands/help) | |
150 (import java.nio.ByteBuffer) | |
151 (import java.awt.image.BufferedImage) | |
152 (import java.awt.Color) | |
153 (import java.awt.Dimension) | |
154 (import java.awt.Graphics) | |
155 (import java.awt.Graphics2D) | |
156 (import java.awt.event.WindowAdapter) | |
157 (import java.awt.event.WindowEvent) | |
158 (import java.awt.image.BufferedImage) | |
159 (import java.nio.ByteBuffer) | |
160 (import javax.swing.JFrame) | |
161 (import javax.swing.JPanel) | |
162 (import javax.swing.SwingUtilities) | |
163 (import javax.swing.ImageIcon) | |
164 (import javax.swing.JOptionPane) | |
165 (import java.awt.image.ImageObserver) | |
166 | |
167 | |
168 (def width 200) | |
169 (def height 200) | |
170 | |
171 (defn camera [] | |
172 (doto (Camera. width height) | |
173 (.setFrustumPerspective 45 1 1 1000) | |
174 (.setLocation (Vector3f. -3 0 -5)) | |
175 (.lookAt Vector3f/ZERO Vector3f/UNIT_Y))) | |
176 | |
177 (defn camera2 [] | |
178 (doto (Camera. width height) | |
179 (.setFrustumPerspective 45 1 1 1000) | |
180 (.setLocation (Vector3f. 3 0 -5)) | |
181 (.lookAt Vector3f/ZERO Vector3f/UNIT_Y))) | |
182 | |
183 (defn setup-fn [world] | |
184 (let [eye (camera) | |
185 width (.getWidth eye) | |
186 height (.getHeight eye)] | |
187 (no-exceptions | |
188 (add-eye | |
189 world | |
190 eye | |
191 (runonce visual)) | |
192 (add-eye | |
193 world | |
194 (camera2) | |
195 (runonce visual))))) | |
196 | |
197 (defn spider-eye [position] | |
198 (doto (Camera. 200 200 ) | |
199 (.setFrustumPerspective 45 1 1 1000) | |
200 (.setLocation position) | |
201 (.lookAt Vector3f/ZERO Vector3f/UNIT_Y))) | |
202 | |
203 (defn setup-fn* [world] | |
204 (let [eye (camera) | |
205 width (.getWidth eye) | |
206 height (.getHeight eye)] | |
207 ;;(.setClearFlags (.getViewPort world) true true true) | |
208 (observer world (.getCamera world)) | |
209 (observer world (spider-eye (Vector3f. 3 0 -5))) | |
210 ;;(observer world (spider-eye (Vector3f. 0 0 -5))) | |
211 ;; (observer world (spider-eye (Vector3f. -3 0 -5))) | |
212 ;; (observer world (spider-eye (Vector3f. 0 3 -5))) | |
213 ;; (observer world (spider-eye (Vector3f. 0 -3 -5))) | |
214 ;; (observer world (spider-eye (Vector3f. 3 3 -5))) | |
215 ;; (observer world (spider-eye (Vector3f. -3 3 -5))) | |
216 ;; (observer world (spider-eye (Vector3f. 3 -3 -5))) | |
217 ;; (observer world (spider-eye (Vector3f. -3 -3 -5))) | |
218 | |
219 ) | |
220 world) | |
221 | |
222 (defn test-world [] | |
223 (let [thing (box 1 1 1 :physical? false)] | |
224 (world | |
225 (doto (Node.) | |
226 (.attachChild thing)) | |
227 {} | |
228 setup-fn | |
229 (fn [world tpf] | |
230 (.rotate thing (* tpf 0.2) 0 0) | |
231 )))) | |
232 | |
233 | |
234 #+end_src | |
235 | |
236 | |
237 #+results: eyes | |
238 : #'body.eye/test-world | |
239 | |
240 Note the use of continuation passing style for connecting the eye to a | |
241 function to process the output. The example code will create two | |
242 videos of the same rotating cube from different angles, sutiable for | |
243 stereoscopic vision. |