本帖最后由 战争傀儡阿格兰 于 2023-5-17 13:54 编辑
代码环境1.171。
【战团】阿格兰魔球修改器——合集https://bbs.mountblade.com.cn/thread-2097734-1-1.html
为了做实时演算,镜头的操作必不可少。在此我抛砖引玉,丢出一段我写的镜头操作代码。
先介绍原理:
1.使用 (mission_cam_set_mode,1,0,0),代码后,镜头会独立开来,不再跟着玩家跑,切换场景后失效
2.使用(mission_cam_set_mode,0),代码后,镜头会回到自己身上。
3.虽然不知道怎么获得cam的位置,但是可以用mission_cam_set_position,pos52),
或者 (mission_cam_animate_to_position,pos52,50,0),移动镜头到指定位置。
但是这两个代码都会旋转镜头方向,比方你指定的位置是agent的pos,那么,
镜头一定会在agent的身后,拍的agent的背部。
贴上native婚礼镜头代码:
可以看到,这个镜头所有的移动都是手动设置好起点,终点、并且手动聚焦到要拍的对象。
设置移动路径还好,毕竟你想运镜,就要移动镜头。但是,聚焦还要手动对准,这个就需要大大量测试与模拟。
举个例子,我要看着一个人,s型跑位,无规律变化那种,就遇到困难了,我镜头不需要动,但是要不停地调整角度去对准它,
更别提,如果镜头和目标对象都在无规则运动时,镜头的对准了。
我提供的方案是个框架,减少你聚焦的工作,并提供一些便利。
代码实际效果:
1.首先你要设定镜头焦点,即拍谁
2.鼠标轮距调整镜头远近,你也可以设为固定值。
3.镜头随便动,基本不会穿模型、穿地面这些有碰撞体积的东西。
4.两种模式: 模式0是跟着目标,鼠标自由视角,类似于骑砍默认;
模式1是镜头自动对准被拍摄目标。镜头的移动的话没做,你既然打开了这个帖子,
你肯定是有自己运镜需求,你可以参考我给出的native婚礼镜头,手动设置起点终点,
也可以额外写个wasd控制镜头移动。在scrip_pos_aim_at_pos脚本中写好了如何移动镜头,在下面引号里。
代码使用方式:要一直触发,但是频率不用太高,减轻cpu负担。模式的切换要你自己去寻找合适的使用方式。
#camera
#把镜头分离出去,条件自己加
(mission_cam_set_mode,1,0,0),
#把镜头变回来,条件自己加
(mission_cam_set_mode,0),
#去定义一个中心目标点pos47,具体自己选
(agent_get_position, pos47, 镜头中心人),
(prop_instance_get_position,pos47,镜头中心物),
#camera distance 镜头拉远推进距离,鼠标滚轮控制
(scene_prop_get_slot,":cam_distance",随便找个东西,第n号slot),#默认-1000
(try_begin),
(key_is_down,key_mouse_scroll_up),
(val_add,":cam_distance",200),
(try_begin),
(gt,":cam_distance",-400),
(assign,":cam_distance",-400),
(try_end),
(scene_prop_set_slot,随便找个东西,第n号slot,":cam_distance"),
(else_try),
(key_is_down,key_mouse_scroll_down),
(val_sub,":cam_distance",200),
(try_begin),
(lt,":cam_distance",-2000),
(assign,":cam_distance",-2000),
(try_end),
(scene_prop_set_slot,随便找个东西,第n号slot,":cam_distance"),
(try_end),
#camera mode镜头模式
(scene_prop_get_slot,":cam_mode",随便找个东西,第n+1号slot),
#默认0,0是跟着目标,鼠标自由视角,类似于骑砍默认,1是锁定目标,镜头的移动需要代码调整,或者额外写个wasd控制镜头移动,角度不用设置,自动对准
(try_begin),
(game_key_clicked,gk_cam_toggle),#(game_key_clicked,gk_view_char),
(try_begin),
(eq,":cam_mode",0),
(assign,":cam_mode",1),
(scene_prop_set_slot,随便找个东西,第n+1号slot,":cam_mode"),
(else_try),
(eq,":cam_mode",1),
(assign,":cam_mode",0),
(scene_prop_set_slot,随便找个东西,第n+1号slot,":cam_mode"),
(try_end),
(try_end),
#camera movement镜头的移动
#模式0
(try_begin),
(eq,":cam_mode",0),
(copy_position,pos60,pos47),
#我抬高了,远近在上面调,要移动镜头在这里调
(position_move_z,pos60,300),
#获取玩家鼠标移动视角,联机环境下不是这句话,没测试
(get_player_agent_no, ":player_agent"),
(agent_get_look_position,pos43,":player_agent"),
#cast ray,自动的不用改
(position_copy_rotation,pos60,pos43),#define ray rotation
(try_begin),
(copy_position,pos58,pos60),
(position_rotate_x,pos58,180),
(store_mul,":cam_ray",":cam_distance",-10),#fixed_point
(cast_ray,":uselessness",pos52,pos58,":cam_ray"),
(get_distance_between_positions,":dist_cam_ray",pos52,pos58),
(position_copy_rotation,pos52,pos43),
(val_div,":dist_cam_ray",-30),#fixed_point
(position_move_y,pos52,":dist_cam_ray"),
(position_rotate_x,pos52,-3),
(position_move_z,pos52,50),
#(mission_cam_set_position,pos52),
#这个50是镜头移动速度
(mission_cam_animate_to_position,pos52,50,0),
(else_try),
(position_move_y,pos60,":cam_distance"),
(copy_position,pos52,pos60),
#(mission_cam_set_position,pos52),
(mission_cam_animate_to_position,pos52,50,0),
(try_end),
#模式1
(else_try),
(eq,":cam_mode",1),
(copy_position,pos60,pos47),
#我抬高了,远近在上面调,要移动镜头在这里调
(position_move_z,pos60,300),
#镜头对准目标
(call_script, "script_pos_aim_at_pos", pos60, pos47),
#【战团】3d空间的瞄准代码。相机聚焦 addmisle 飞行物 战场ai 场景动画 2d动画https://bbs.mountblade.com.cn/thread-2098881-1-1.html
#这个脚本是我写的,也可以拆出来,用assign写
#cast ray,自动的不用改
(position_copy_rotation,pos60,pos43),#define ray rotation
(try_begin),
(copy_position,pos58,pos60),
(position_rotate_x,pos58,180),
(store_mul,":cam_ray",":cam_distance",-10),#fixed_point
(cast_ray,":uselessness",pos52,pos58,":cam_ray"),
(get_distance_between_positions,":dist_cam_ray",pos52,pos58),
(position_copy_rotation,pos52,pos43),
(val_div,":dist_cam_ray",-30),#fixed_point
(position_move_y,pos52,":dist_cam_ray"),
(position_rotate_x,pos52,-3),
(position_move_z,pos52,50),
#(mission_cam_set_position,pos52),
#这个50是镜头移动速度
(mission_cam_animate_to_position,pos52,50,0),
(else_try),
(position_move_y,pos60,":cam_distance"),
(copy_position,pos52,pos60),
#(mission_cam_set_position,pos52),
(mission_cam_animate_to_position,pos52,50,0),
(try_end),
(try_end),
|