gmod吧 关注:90,858贴子:1,903,643
  • 7回复贴,共1

【wiremod】让你的物体随holo动起来——E2的holoParent教程

取消只看楼主收藏回复

建造载具的时候,想实现开关门的效果,但是...
怕gmod约束的质量太烂?
怕载具约束太多而卡服?
只用holo也能实现效果!但是...漏风 & 不防弹???
.....
那么你需要——holoParent大法!
效果如图
————



————
这篇教程的目的是:讲解如何移动holo,以及如何把物体parent到holo上
————
最近较忙,先开坑,缓更
欢迎插楼,建议使用只看楼主功能


IP属地:广东1楼2020-04-14 00:42回复
    需要的工具:Precision Alignment,Wiremod
    ————
    Precision Alignment:用来找出物体的相对位置,从而快速定位holo,不用手动慢慢调

    ————
    Wiremod:E2你懂的


    IP属地:广东3楼2020-04-14 00:49
    回复
      2025-09-14 04:32:04
      广告
      不感兴趣
      开通SVIP免广告
      首先,我们要用Precision Alignment(PA)工具获取物体相对于底盘(base)的坐标
      ————
      随便刷出一块板子当作base

      ————
      随便刷一个物品用来定位holo

      ————
      随便摆到合适位置

      ————
      找到PA工具,选Mass Center或者Coordinate Center,意思分别是质心和坐标中心
      -这样确保PA打出来的点在物体的质心/坐标中心上
      -当然,你直接用HitPos打点也可以,在这里区别不大

      ————
      对base右键,物体左键,按R打开PA菜单,在Point选项里面勾上relative to entity,然后点击copy
      -勾上Relative to Entity一是告诉PA我们要相对坐标,二是更新右侧坐标显示
      -copy是直接复制XYZ三个坐标轴的数据

      ————
      小知识:
      相对坐标就是把坐标系建立在base上,在此坐标系找到物体的坐标
      与之相对的是绝对坐标,相当于坐标系在地图上


      IP属地:广东4楼2020-04-14 13:28
      回复
        下面简单编辑一下E2
        ————
        找到E2工具,直接左键在板子上刷一个出来

        ————
        对着E2按右键编辑,复制粘贴如下内容,保存并更新
        @name Test
        @inputs Base:entity #定义输入变量Base,类型为实体entity
        @outputs
        @persist
        @Trigger
        if(first()) #初始化
        {
        Pos=vec(#[your data]#) #声明局部变量,三维向量,里面的数据需要替换成PA菜单里Copy的数值
        Ang=ang(0) #声明局部变量,角度,ang(0) = ang(0, 0, 0),分别表示俯仰角,偏航角,滚转角
        holoCreate(1) #初始化直接生成holo,序号为1
        holoPos(1, Base:toWorld(Pos)) #设置1号holo的坐标
        holoAng(1, Base:toWorld(Ang)) #设置1号holo的角度
        holoParent(1, Base) #把1号holo Parent到板子上
        }

        ————
        注意把#[your data]#替换成PA菜单里面Copy的数值

        ————
        用wire工具连线,把E2的Base[Entity]连到板子的entity[Entity],之后用E2工具对E2按R刷新

        可以看到已经在易拉罐位置生成了一个holo
        ————
        小知识:
        Global Vector = Entity:toWorld( Local Vector ) #toWorld函数返回相对坐标Vector在Entity坐标系的绝对坐标
        Global Angle = Entity:toWorld( Local Angle ) #角度也可以使用


        IP属地:广东9楼2020-04-15 14:52
        回复
          接着我们让holo动起来,为了简单起见,就先让E2绕圆心转动吧
          下面的内容主要都是讲解E2了,你也可以在本楼最下面直接复制E2代码
          ————
          首先将E2改成这样:
          @name Test
          @inputs Base:entity
          @outputs
          @persist Pos:vector Ang:angle Radius Yaw #定义全局变量,Pos类型为三维向量,Ang为角度,Radius和Yaw为数字
          @Trigger
          interval(50) #E2每50毫秒更新一次,必须让E2一直更新才能实现移动,如果想运动得快一点,可以调低数值,最低10
          if(first())
          {
          Pos=vec(-6.981, 35.17, 21.47) #Pos和Ang已经定义成全局变量了,所以这里只是给他们初始化
          Ang=ang(0)
          Radius=30 #初始化变量,把圆周运动的半径设置成30起源单位
          holoCreate(1)
          holoPos(1, Base:toWorld(Pos))
          holoAng(1, Base:toWorld(Ang))
          holoParent(1, Base)
          }
          Yaw++ #让Yaw变量一直自加1,相当于自变量,自变量变了因变量才会跟着变
          if(Yaw>=360)
          {
          Yaw=0 #因为E2中三角函数用的单位是°,所以当Yaw大于等于360°就变回0,相当于走完一个周期
          }
          MoveAng = ang(0, Yaw, 0) #holo转动的角度,只要转动偏航角就行
          MovePos = vec(Radius * sin(Yaw), Radius * cos(Yaw), 0) #holo运动的坐标,X轴是Radius * sin(Yaw),Y轴是Radius * cos(Yaw),Z轴为0,初中数学
          holoPos(1, Base:toWorld(Pos + MovePos)) #最终给holo设置的坐标就是初始坐标 + 运动坐标
          holoAng(1, Base:toWorld(Ang + MoveAng)) #角度同理

          效果:

          holo转动的角度反了啊...再改改
          ————
          改动:
          26行MoveAng = ang(0, Yaw, 0),在Yaw前面加一个负号,变成MoveAng = ang(0, -Yaw, 0)

          ————
          最终效果:

          E2代码:
          @name Test
          @inputs Base:entity
          @outputs
          @persist Pos:vector Ang:angle Radius Yaw
          @trigger
          interval(50)
          if(first())
          {
          Pos=vec(-6.981, 35.17, 21.47)
          Ang=ang(0)
          Radius=30
          holoCreate(1)
          holoPos(1, Base:toWorld(Pos))
          holoAng(1, Base:toWorld(Ang))
          holoParent(1, Base)
          }
          Yaw++
          if(Yaw>=360)
          {
          Yaw=0
          }
          MoveAng = ang(0, -Yaw, 0)
          MovePos = vec(Radius * sin(Yaw), Radius * cos(Yaw), 0)
          holoPos(1, Base:toWorld(Pos + MovePos))
          holoAng(1, Base:toWorld(Ang + MoveAng))


          IP属地:广东10楼2020-04-15 15:31
          回复
            下面试试把物体parent到holo
            ————
            首先在控制台输入wire_expression2_extension_enable propcore

            控制台会提示10秒后重载E2

            ————
            然后随便刷一个物体

            随便摆到一个位置,冻结
            ————
            更新E2为以下内容:
            @name Test
            @inputs Base:entity Breen:entity #添加一个接口用来输入新的实体
            @outputs
            @persist Pos:vector Ang:angle Yaw Open Z #运动参数变为Z,并用按键控制Open来达到开关效果
            @Trigger
            interval(50)
            if(first())
            {
            Pos=vec(-6.981, 35.17, 21.47)
            Ang=ang(0)
            Open=-1 #初始化Open为-1
            holoCreate(1)
            holoPos(1, Base:toWorld(Pos))
            holoAng(1, Base:toWorld(Ang))
            holoParent(1, Base)
            BreenPos=vec(#[your vec here]#) #初始化新实体相对坐标
            BreenAng=ang(#[your ang here]#) #初始化新实体绝对角度
            Breen:setPos(Base:toWorld(BreenPos)) #初始化的时候设置新实体坐标
            Breen:setAng(BreenAng) #初始化的时候设置新实体角度
            Breen:propFreeze(1) #初始化冻结物体,不然可能会往下掉
            #Breen:parentTo(holoEntity(1)) #先不要Parent物体,不然不能调物体坐标
            }
            G=owner():keyPressed("g") #检测E2主人是否按G键
            if(changed(G)&G) #changed( variable )函数检测变量是否改变,改变返回1,这里是检测按键按下一刻返回1
            {
            Open=-Open #开关变量变负
            }
            Z=clamp(Z+Open, 0, 10) #运动参数,自加Open,并限制在0和10之间,这里Open相当于运动速度
            MovePos=vec(0, 0, Z)
            MoveAng=ang(0)
            holoPos(1, Base:toWorld(Pos + MovePos))
            holoAng(1, Base:toWorld(Ang + MoveAng))

            ————
            按照之前的步骤用PA得到物体的相对坐标


            获取绝对角度


            ————
            用wire工具连接E2的新接口到实体上


            IP属地:广东14楼2020-04-26 20:57
            回复
              接上楼
              ————
              用E2工具对E2按R,刷新E2


              ————
              然后E2工具右键E2打开编辑器,把第27行的注释符号删除,Upload

              ————
              按G键可以看到效果了

              ——***注意***——
              如果在物体调好位置前,不注释27行,物体直接就被parent到holo,无法改变相对位置了

              *parent之后无论怎么刷新,物体不能移动到目标位置

              *注释parent,先调好物体位置,再删除注释,物体才会移动到目标位置
              所以parent前务必再三检查!


              IP属地:广东15楼2020-04-26 21:08
              回复
                主要内容已经结束了,下面再讲解一下如何实现holo多段运动,平滑运动以及一些实例


                IP属地:广东16楼2020-04-26 21:22
                回复