Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -10,6 +10,9 @@ def load_aframe_and_extras():
|
|
10 |
<script>
|
11 |
let score = 0;
|
12 |
let selectedEntity = null;
|
|
|
|
|
|
|
13 |
|
14 |
AFRAME.registerComponent('draggable', {
|
15 |
init: function () {
|
@@ -67,46 +70,40 @@ def load_aframe_and_extras():
|
|
67 |
var rig = document.querySelector('#rig');
|
68 |
var gw = 8, gh = 8;
|
69 |
var center = {x: 0, y: 0, z: 0};
|
70 |
-
var height = Math.max(gw, gh) * 1.5; // y=12
|
71 |
-
var
|
|
|
72 |
var pos, rot;
|
73 |
|
|
|
|
|
74 |
switch(view) {
|
75 |
-
case '
|
76 |
pos = {x: center.x, y: height, z: center.z};
|
77 |
-
rot = {x: -90, y: 0, z: 0};
|
78 |
break;
|
79 |
case 'left':
|
80 |
-
pos = {x: -
|
81 |
-
rot = {x: 0, y: 90, z: 0}; // Face right (towards center), y-axis up
|
82 |
break;
|
83 |
case 'right':
|
84 |
-
pos = {x:
|
85 |
-
rot = {x: 0, y: -90, z: 0}; // Face left (towards center), y-axis up
|
86 |
break;
|
87 |
case 'front':
|
88 |
-
pos = {x: center.x, y:
|
89 |
-
rot = {x: 0, y: 0, z: 0}; // Face forward (towards center), y-axis up
|
90 |
break;
|
91 |
case 'back':
|
92 |
-
pos = {x: center.x, y:
|
93 |
-
rot = {x: 0, y: 180, z: 0}; // Face backward (towards center), y-axis up
|
94 |
break;
|
95 |
case 'angle1':
|
96 |
-
pos = {x: -
|
97 |
-
rot = {x: 0, y: 45, z: 0}; // Face towards center from top-left corner
|
98 |
break;
|
99 |
case 'angle2':
|
100 |
-
pos = {x:
|
101 |
-
rot = {x: 0, y: -45, z: 0}; // Face towards center from top-right corner
|
102 |
break;
|
103 |
case 'angle3':
|
104 |
-
pos = {x: -
|
105 |
-
rot = {x: 0, y: 135, z: 0}; // Face towards center from bottom-left corner
|
106 |
break;
|
107 |
case 'angle4':
|
108 |
-
pos = {x:
|
109 |
-
rot = {x: 0, y: -135, z: 0}; // Face towards center from bottom-right corner
|
110 |
break;
|
111 |
}
|
112 |
rig.setAttribute('position', pos);
|
@@ -115,45 +112,45 @@ def load_aframe_and_extras():
|
|
115 |
|
116 |
function flyCamera(action) {
|
117 |
var rig = document.querySelector('#rig');
|
118 |
-
var pos = rig.getAttribute('position');
|
119 |
var rot = rig.getAttribute('rotation');
|
120 |
-
var
|
121 |
|
122 |
switch(action) {
|
123 |
case 'forward':
|
124 |
-
|
125 |
-
dir.applyQuaternion(rig.object3D.quaternion);
|
126 |
-
pos.x += dir.x * speed;
|
127 |
-
pos.y += dir.y * speed;
|
128 |
-
pos.z += dir.z * speed;
|
129 |
break;
|
130 |
case 'backward':
|
131 |
-
|
132 |
-
dir.applyQuaternion(rig.object3D.quaternion);
|
133 |
-
pos.x += dir.x * speed;
|
134 |
-
pos.y += dir.y * speed;
|
135 |
-
pos.z += dir.z * speed;
|
136 |
break;
|
137 |
-
case '
|
138 |
-
|
139 |
break;
|
140 |
-
case '
|
141 |
-
rot.
|
142 |
break;
|
143 |
-
case '
|
144 |
-
rot.
|
145 |
-
break;
|
146 |
-
case 'rotateRight':
|
147 |
-
rot.y -= rSpeed;
|
148 |
break;
|
149 |
case 'reset':
|
150 |
-
moveCamera('
|
|
|
151 |
return;
|
152 |
}
|
153 |
-
rig.setAttribute('position', pos);
|
154 |
rig.setAttribute('rotation', rot);
|
155 |
}
|
156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
function fireRaycast() {
|
158 |
var cam = document.querySelector('[camera]');
|
159 |
var dir = new THREE.Vector3(); cam.object3D.getWorldDirection(dir);
|
@@ -173,7 +170,7 @@ def load_aframe_and_extras():
|
|
173 |
|
174 |
document.addEventListener('keydown', e => {
|
175 |
switch(e.key.toLowerCase()){
|
176 |
-
case '1': moveCamera('
|
177 |
case '2': moveCamera('left'); break;
|
178 |
case '3': moveCamera('right'); break;
|
179 |
case '4': moveCamera('front'); break;
|
@@ -184,11 +181,9 @@ def load_aframe_and_extras():
|
|
184 |
case '9': moveCamera('angle4'); break;
|
185 |
case 'w': flyCamera('forward'); break;
|
186 |
case 'x': flyCamera('backward'); break;
|
187 |
-
case '
|
188 |
-
case '
|
189 |
-
case '
|
190 |
-
case 'e': flyCamera('rotateRight'); break;
|
191 |
-
case 's': flyCamera('reset'); break;
|
192 |
case ' ': fireRaycast(); break;
|
193 |
}
|
194 |
});
|
@@ -266,7 +261,7 @@ def main():
|
|
266 |
st.markdown("### 🧭 Camera Views")
|
267 |
st.markdown("**Select View** 📷")
|
268 |
cols = st.columns(3)
|
269 |
-
cols[0].button("
|
270 |
cols[1].button("⬅️ Left", on_click=lambda: st.session_state.update({'camera_view': 'left'}))
|
271 |
cols[2].button("➡️ Right", on_click=lambda: st.session_state.update({'camera_view': 'right'}))
|
272 |
cols = st.columns(3)
|
@@ -278,19 +273,6 @@ def main():
|
|
278 |
cols[1].button("↙️ Angle 3", on_click=lambda: st.session_state.update({'camera_view': 'angle3'}))
|
279 |
cols[2].button("↘️ Angle 4", on_click=lambda: st.session_state.update({'camera_view': 'angle4'}))
|
280 |
|
281 |
-
st.markdown("### ✈️ Flight Controls")
|
282 |
-
st.markdown("**Fly Camera** 🎮")
|
283 |
-
cols = st.columns(3)
|
284 |
-
cols[0].button("Q Rotate Left", on_click=lambda: st.session_state.update({'fly_action': 'rotateLeft'}))
|
285 |
-
cols[1].button("W Forward", on_click=lambda: st.session_state.update({'fly_action': 'forward'}))
|
286 |
-
cols[2].button("E Rotate Right", on_click=lambda: st.session_state.update({'fly_action': 'rotateRight'}))
|
287 |
-
cols = st.columns(3)
|
288 |
-
cols[0].button("A Pan Left", on_click=lambda: st.session_state.update({'fly_action': 'panLeft'}))
|
289 |
-
cols[1].button("S Reset", on_click=lambda: st.session_state.update({'fly_action': 'reset'}))
|
290 |
-
cols[2].button("D Pan Right", on_click=lambda: st.session_state.update({'fly_action': 'panRight'}))
|
291 |
-
cols = st.columns(1)
|
292 |
-
cols[0].button("X Backward", on_click=lambda: st.session_state.update({'fly_action': 'backward'}))
|
293 |
-
|
294 |
st.markdown("### ➕ Add Media Files")
|
295 |
ups = st.file_uploader("Add files (png, jpeg, obj, glb, mp4, etc.):", accept_multiple_files=True)
|
296 |
st.markdown("### 📋 Uploaded Model Files")
|
@@ -341,7 +323,7 @@ def main():
|
|
341 |
assets, ents = generate_tilemap(files, directory, 8, 8)
|
342 |
scene += assets + ents + "</a-scene>"
|
343 |
|
344 |
-
view_cmd = st.session_state.get('camera_view', '
|
345 |
if view_cmd:
|
346 |
scene += f"<script>moveCamera('{view_cmd}');</script>"
|
347 |
st.session_state.pop('camera_view', None)
|
|
|
10 |
<script>
|
11 |
let score = 0;
|
12 |
let selectedEntity = null;
|
13 |
+
let velocity = {x: 0, y: 0, z: 0};
|
14 |
+
let maxSpeed = 0.5;
|
15 |
+
let accel = 0.02;
|
16 |
|
17 |
AFRAME.registerComponent('draggable', {
|
18 |
init: function () {
|
|
|
70 |
var rig = document.querySelector('#rig');
|
71 |
var gw = 8, gh = 8;
|
72 |
var center = {x: 0, y: 0, z: 0};
|
73 |
+
var height = Math.max(gw, gh) * 1.5; // y=12 for center view
|
74 |
+
var lowHeight = height / 2; // y=6 for closer views
|
75 |
+
var offset = Math.max(gw, gh); // x/z offset=8 to position at the edge
|
76 |
var pos, rot;
|
77 |
|
78 |
+
rot = {x: -90, y: 0, z: 0}; // Always top-down view
|
79 |
+
|
80 |
switch(view) {
|
81 |
+
case 'center':
|
82 |
pos = {x: center.x, y: height, z: center.z};
|
|
|
83 |
break;
|
84 |
case 'left':
|
85 |
+
pos = {x: -offset, y: lowHeight, z: center.z};
|
|
|
86 |
break;
|
87 |
case 'right':
|
88 |
+
pos = {x: offset, y: lowHeight, z: center.z};
|
|
|
89 |
break;
|
90 |
case 'front':
|
91 |
+
pos = {x: center.x, y: lowHeight, z: -offset};
|
|
|
92 |
break;
|
93 |
case 'back':
|
94 |
+
pos = {x: center.x, y: lowHeight, z: offset};
|
|
|
95 |
break;
|
96 |
case 'angle1':
|
97 |
+
pos = {x: -offset, y: lowHeight, z: -offset};
|
|
|
98 |
break;
|
99 |
case 'angle2':
|
100 |
+
pos = {x: offset, y: lowHeight, z: -offset};
|
|
|
101 |
break;
|
102 |
case 'angle3':
|
103 |
+
pos = {x: -offset, y: lowHeight, z: offset};
|
|
|
104 |
break;
|
105 |
case 'angle4':
|
106 |
+
pos = {x: offset, y: lowHeight, z: offset};
|
|
|
107 |
break;
|
108 |
}
|
109 |
rig.setAttribute('position', pos);
|
|
|
112 |
|
113 |
function flyCamera(action) {
|
114 |
var rig = document.querySelector('#rig');
|
|
|
115 |
var rot = rig.getAttribute('rotation');
|
116 |
+
var rSpeed = 2;
|
117 |
|
118 |
switch(action) {
|
119 |
case 'forward':
|
120 |
+
velocity.z = Math.max(velocity.z - accel, -maxSpeed);
|
|
|
|
|
|
|
|
|
121 |
break;
|
122 |
case 'backward':
|
123 |
+
velocity.z = Math.min(velocity.z + accel, maxSpeed);
|
|
|
|
|
|
|
|
|
124 |
break;
|
125 |
+
case 'stop':
|
126 |
+
velocity = {x: 0, y: 0, z: 0};
|
127 |
break;
|
128 |
+
case 'rollCCW':
|
129 |
+
rot.z += rSpeed;
|
130 |
break;
|
131 |
+
case 'rollCW':
|
132 |
+
rot.z -= rSpeed;
|
|
|
|
|
|
|
133 |
break;
|
134 |
case 'reset':
|
135 |
+
moveCamera('center');
|
136 |
+
velocity = {x: 0, y: 0, z: 0};
|
137 |
return;
|
138 |
}
|
|
|
139 |
rig.setAttribute('rotation', rot);
|
140 |
}
|
141 |
|
142 |
+
function updateCameraPosition() {
|
143 |
+
var rig = document.querySelector('#rig');
|
144 |
+
var pos = rig.getAttribute('position');
|
145 |
+
pos.x += velocity.x;
|
146 |
+
pos.y += velocity.y;
|
147 |
+
pos.z += velocity.z;
|
148 |
+
rig.setAttribute('position', pos);
|
149 |
+
requestAnimationFrame(updateCameraPosition);
|
150 |
+
}
|
151 |
+
|
152 |
+
requestAnimationFrame(updateCameraPosition);
|
153 |
+
|
154 |
function fireRaycast() {
|
155 |
var cam = document.querySelector('[camera]');
|
156 |
var dir = new THREE.Vector3(); cam.object3D.getWorldDirection(dir);
|
|
|
170 |
|
171 |
document.addEventListener('keydown', e => {
|
172 |
switch(e.key.toLowerCase()){
|
173 |
+
case '1': moveCamera('center'); break;
|
174 |
case '2': moveCamera('left'); break;
|
175 |
case '3': moveCamera('right'); break;
|
176 |
case '4': moveCamera('front'); break;
|
|
|
181 |
case '9': moveCamera('angle4'); break;
|
182 |
case 'w': flyCamera('forward'); break;
|
183 |
case 'x': flyCamera('backward'); break;
|
184 |
+
case 's': flyCamera('stop'); break;
|
185 |
+
case 'q': flyCamera('rollCCW'); break;
|
186 |
+
case 'e': flyCamera('rollCW'); break;
|
|
|
|
|
187 |
case ' ': fireRaycast(); break;
|
188 |
}
|
189 |
});
|
|
|
261 |
st.markdown("### 🧭 Camera Views")
|
262 |
st.markdown("**Select View** 📷")
|
263 |
cols = st.columns(3)
|
264 |
+
cols[0].button("🔳 Center", on_click=lambda: st.session_state.update({'camera_view': 'center'}))
|
265 |
cols[1].button("⬅️ Left", on_click=lambda: st.session_state.update({'camera_view': 'left'}))
|
266 |
cols[2].button("➡️ Right", on_click=lambda: st.session_state.update({'camera_view': 'right'}))
|
267 |
cols = st.columns(3)
|
|
|
273 |
cols[1].button("↙️ Angle 3", on_click=lambda: st.session_state.update({'camera_view': 'angle3'}))
|
274 |
cols[2].button("↘️ Angle 4", on_click=lambda: st.session_state.update({'camera_view': 'angle4'}))
|
275 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
276 |
st.markdown("### ➕ Add Media Files")
|
277 |
ups = st.file_uploader("Add files (png, jpeg, obj, glb, mp4, etc.):", accept_multiple_files=True)
|
278 |
st.markdown("### 📋 Uploaded Model Files")
|
|
|
323 |
assets, ents = generate_tilemap(files, directory, 8, 8)
|
324 |
scene += assets + ents + "</a-scene>"
|
325 |
|
326 |
+
view_cmd = st.session_state.get('camera_view', 'center')
|
327 |
if view_cmd:
|
328 |
scene += f"<script>moveCamera('{view_cmd}');</script>"
|
329 |
st.session_state.pop('camera_view', None)
|