@@ -98,6 +98,8 @@ def __init__(self, server: viser.ViserServer, viewer):
98
98
self .loop : bool = False
99
99
self .smoothness : float = 0.5 # Tension / alpha term.
100
100
self .default_fov : float = 0.0
101
+ self .framerate : float = 0
102
+ self .duration : float = 0
101
103
102
104
def set_keyframes_visible (self , visible : bool ) -> None :
103
105
self ._keyframes_visible = visible
@@ -118,7 +120,7 @@ def add_camera(self, keyframe: Keyframe, keyframe_index: Optional[int] = None) -
118
120
fov = keyframe .override_fov_value if keyframe .override_fov_enabled else self .default_fov ,
119
121
aspect = keyframe .aspect ,
120
122
scale = 0.1 ,
121
- color = (127 , 127 , 127 ),
123
+ color = (255 , 0 , 255 ),
122
124
wxyz = keyframe .wxyz ,
123
125
position = keyframe .position ,
124
126
visible = self ._keyframes_visible ,
@@ -323,6 +325,10 @@ def update_spline(self) -> None:
323
325
self ._spline = None
324
326
return
325
327
328
+ num_frames = int (self .duration * self .framerate )
329
+ if num_frames <= 0 :
330
+ return
331
+
326
332
# Update internal splines.
327
333
self ._orientation_spline = splines .quaternion .KochanekBartels (
328
334
[
@@ -378,7 +384,7 @@ def update_spline(self) -> None:
378
384
# Update visualized spline.
379
385
num_keyframes = len (keyframes ) + 1 if self .loop else len (keyframes )
380
386
points_array = onp .array (
381
- [self ._position_spline .evaluate (t ) for t in onp .linspace (0 , num_keyframes - 1 , num_keyframes * 100 )]
387
+ [self ._position_spline .evaluate (t ) for t in onp .linspace (0 , num_keyframes - 1 , num_frames )]
382
388
)
383
389
colors_array = onp .array ([colorsys .hls_to_rgb (h , 0.5 , 1.0 ) for h in onp .linspace (0.0 , 1.0 , len (points_array ))])
384
390
self ._spline = self ._server .add_point_cloud (
@@ -578,8 +584,8 @@ def _(_) -> None:
578
584
579
585
playback_folder = server .gui .add_folder ("Playback" )
580
586
with playback_folder :
581
- duration_number = server .gui .add_number ("Duration (sec)" , min = 0.0 , max = 1e8 , step = 0.0001 , initial_value = 4.0 )
582
- framerate_number = server .gui .add_number ("Frame rate (FPS)" , min = 0.1 , max = 240.0 , step = 1e-8 , initial_value = 30.0 )
587
+ duration_number = server .gui .add_number ("Duration (sec)" , min = 0.0 , max = 1e8 , step = 0.001 , initial_value = 4.0 )
588
+ framerate_number = server .gui .add_number ("Frame rate (FPS)" , min = 0.1 , max = 240.0 , step = 1e-2 , initial_value = 30.0 )
583
589
framerate_buttons = server .gui .add_button_group ("" , ("24" , "30" , "60" ))
584
590
585
591
@framerate_buttons .on_click
@@ -687,6 +693,10 @@ def _(_) -> None:
687
693
else :
688
694
preview_frame_slider = old
689
695
696
+ camera_path .duration = duration_number .value
697
+ camera_path .framerate = framerate_number .value
698
+ camera_path .update_spline ()
699
+
690
700
# Play the camera trajectory when the play button is pressed.
691
701
@play_button .on_click
692
702
def _ (_ ) -> None :
@@ -898,7 +908,11 @@ def _(event):
898
908
viewer .show_message ("Error occurred while parsing camera path file" , event .client )
899
909
900
910
camera_path = CameraPath (server , viewer )
911
+ camera_path .loop = loop .value
912
+ camera_path .smoothness = smoothness .value
901
913
camera_path .default_fov = fov_degrees .value / 180.0 * onp .pi
914
+ camera_path .duration = duration_number .value
915
+ camera_path .framerate = framerate_number .value
902
916
903
917
transform_controls : List [viser .SceneNodeHandle ] = []
904
918
0 commit comments