Hey guys I’m working on automating things on my cameras, I have camera on levels that I generated and I wrote a python script to generate either for the clicked camera or for all cameras in scene their own level sequencer, I added tracks , camerashake track and all but I’m having issue is that the camera resets its position since the transform track when added is set to 0,0,0 and the camera is bind to that level sequence.
I’m still learning the Python API for UE so might have missed something
I didn’t understand how to do that in python I know it has something to do with accessing channels/double channels and add_key to channel X,Y,Z with camera initial location.
I did so with blueprint but if possible would like to get it all in python here’s my code for the generation of level sequencer of a clicked camera :
#test_spawn for one camera(a effacer)
import unreal
ls_system = unreal.get_editor_subsystem(unreal.LevelSequenceEditorSubsystem)
selected_actors=unreal.EditorLevelLibrary.get_selected_level_actors()
camera_actor=None
def populate_track(sequence, track, num_sections = 1, section_length_seconds = 1):
for i in range(num_sections):
section = track.add_section()
section.set_start_frame_seconds(i*section_length_seconds)
section.set_end_frame_seconds(section_length_seconds)
def populate_binding(sequence, binding, num_sections = 1, section_length_seconds = 10):
for track in binding.get_tracks():
populate_track(sequence, track, num_sections, section_length_seconds)
#voir si dans les acteurs selectionne y a une cinecam
for actor in selected_actors:
if isinstance(actor,unreal.CineCameraActor):
camera_actor=actor
unreal.log_warning("is found")
break
if not camera_actor:
unreal.log_warning("No cine camera is found")
else:
#créer le level sequencer de la camera selectionee
cam_name=camera_actor.get_actor_label()
Myasset_name=f"{cam_name}_LS"
Mypackage_path= "/Game/Cinematics/Sequences"
Myfactory=unreal.LevelSequenceFactoryNew()
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
level_sequence= asset_tools.create_asset(
asset_name=Myasset_name,
package_path=Mypackage_path,
asset_class=unreal.LevelSequence,
factory=Myfactory
)
#rajouter la caméra selectionnee comme possesable
binding=level_sequence.add_possessable(camera_actor)
unreal.EditorAssetLibrary.save_loaded_asset(level_sequence)
#rajouter les track et sections
start_frame = level_sequence.get_playback_start()
end_frame = level_sequence.get_playback_end()
camera = unreal.CineCameraActor.cast(camera_actor)
camera_cut_track = level_sequence.add_track(unreal.MovieSceneCameraCutTrack)
# Add a camera cut track for this camera
camera_cut_section = camera_cut_track.add_section()
camera_cut_section.set_range(start_frame,end_frame)
camera_binding_id = unreal.MovieSceneObjectBindingID()
camera_binding_id.set_editor_property("Guid", binding.get_id())
camera_cut_section.set_editor_property("CameraBindingID", camera_binding_id)
# Add a camera transform track
transform_track = binding.add_track(unreal.MovieScene3DTransformTrack)
transform_section = transform_track.add_section()
# Add a shake track
transform_section.set_range(start_frame, end_frame)
populate_track(level_sequence, transform_track, 1, 5)
shake_track=binding.add_track(unreal.MovieSceneCameraShakeTrack)
shake_section=shake_track.add_section()
shake_section.set_range(start_frame,end_frame)
unreal.LevelSequenceEditorBlueprintLibrary.refresh_current_level_sequence()
#spawn le level sequencer à l'endroit ou se trouve la cam selectionee
spawn_location= camera_actor.get_actor_location()
sequence_actor=unreal.EditorLevelLibrary.spawn_actor_from_class(unreal.LevelSequenceActor,spawn_location)
sequence_actor.set_sequence(level_sequence)