本帖最后由 战争傀儡阿格兰 于 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),  
 |