[V CAST] 기획 중인 카메라 조작을 참가자들에게 해줄 수 있었으면 좋겠어요.

카메라 운영도 어렵고.
요즘 V 캐릭터에서'밤에도 정해!'(링컨은 아침까지 정답인 패러디) 참가자들이 칠판에 쓴 것을 순서대로 전시하는 형식으로 기획했다.
이와 함께 간담회과 기획에 활용할 수 있는 아래 테이블을 제작했다.

사용 방법은 참가자를 상술한 책상 주위에 서도록 하는 것이다
진행을 할 때 여러분과 이야기를 할 때 영상을 찍습니다.
특정한 누군가가 말을 할 때 그 사람의 클로즈업 영상
를 참고하십시오.
처음에는 운영진에게 카메라를 겨누고 싶었지만 다음과 같은 과제가 나왔다.
• 다른 작업이 진행 중이어서 카메라를 조작할 수 없습니다
• 누가 말하고 있는지 판별하고 카메라를 전환해야 한다
(목소리가 비슷하거나 처음 보는 사람이 잘못 바뀐다)
• 참가자들의 버튼을 준비해야 하기 때문에 번거롭다
좋은 방법이 없을까 고민 중인데 원래 좌담회와 대희리의 형식은 한 사람이 많이 말하는 것이기 때문에 카메라는 참가자가 말을 할 때 참가자가 스스로 하면 된다!이렇게 생각하면서 이런 형식의 VCD를 만들었다.
말하는 사람이 카메라를 마주하는 장치를 만들어주세요.
따라서 이번에는 상기 표의 VCD를 대상으로 참가자가 직접 카메라를 조작할 수 있다.
시나리오(제한 사항)
  • 참가자들이 탁자를 둘러싸고 서 있다
  • 인원수가 불분명하다.누구나 대응 가능
  • 책상 위에 버튼 등 여분의 물건을 놓고 싶지 않다
  • 상기 내용에 따라 제작된 기능
  • 카메라의 조작은 버튼 등이 아니라 책상 손잡이로 한다
  • 책상을 잡으면 그 사람의 클로즈업이 보인다.
  • 다른 사람이 누르면 똑같이 그 사람을 향해.
  • 자신에게 맞는 상태에서 한 번 더 누르면 서랍으로 돌아간다.
  • 완제품은 다음과 같은 인상이다.

    unity
    유닛의 구성은 다음과 같다.
    ・ArcTable: 탁자.이걸 잡으면 카메라를 바꿀 수 있어요.
    ・RefCamera_UP(파란색 구 부분): 업로드할 때 카메라의 이동 위치
    ・RefCamera_All(붉은 공 부분): 신축할 때 카메라의 이동 위치
    (※ 이해하기 쉽게 파란색이나 빨간색 공을 넣었지만, 실제 VCD에는 공이 없었다)

    코드(lua)
    다음 순서에 따라 설명한다.
    ① 특정인의 위상 처리
    ② 카메라 뽑기 처리
    ③ 카메라를 손잡이로 돌리기
    (※ 설명 외에 정의된 변수는 코드 내에서 사용됩니다. 적당히 다시 읽어 주십시오.)
    ① 특정인의 위상 처리
    주로 다음과 같은 3가지 처리를 진행한다
    ・시야각 변경(적절한 고정값)
    • 매개변수로 전송된 좌표에 카메라를 향합니다(Y 좌표는 평행)
    • 카메라 리프Camera_위로 이동
    실제로 이동하고 싶은 사용자의 위치를 매개 변수에 맡기는 형식입니다.
    function SetCameraUp(targetPos)
      local camera = vci.studio.GetHandiCamera()
      if camera then
    
        -- カメラの画角設定(値は適当)。システム設定のGetMinFieldOfViewが変わるとちゃんと動かなくなるかもしれないので一応maxとってる
        local fov = math.max(38,camera.GetMinFieldOfView())
        camera.SetFieldOfView(fov)
    
        if targetPos then
          local direction = targetPos - ITEM.RefCameraUp.GetPosition()
    
          --カメラの向く向きを計算。y軸の傾きは0にする
          local up = Vector3.__new(direction.x,0,direction.z)
          local lookAt = Quaternion.LookRotation(up,Vector3.up) 
          camera.SetRotation(lookAt)
        end
        -- カメラを移動する
        camera.SetPosition(ITEM.RefCameraUp.GetPosition())
      end
    end
    
    ② 카메라 뽑기 처리
    주로 다음과 같은 3가지 처리를 진행한다
    ・시야각 변경(적절한 고정값)
    ・카메라를 탁자의 좌표로 향하게 (Y 좌표는 평행으로 유지)
    • 카메라 리프Camera_All로 이동
    Up에서 사용하는 함수를 요약할 수 있을 것 같지만 잠시 분리합니다.
    function SetCameraAll()
      local camera = vci.studio.GetHandiCamera()
      local targetPos = ITEM.DonutsTable.GetPosition()
    
      if camera then
        -- カメラの画角設定。システム設定のGetMinFieldOfViewが変わるとちゃんと動かなくなるかもしれないので一応maxとってる
        local fov = math.max(40,camera.GetMinFieldOfView())
        camera.SetFieldOfView(fov)
    
        local direction = targetPos - ITEM.RefCameraAll.GetPosition()
        if targetPos then
          local direction = targetPos - ITEM.RefCameraAll.GetPosition()
    
          --カメラの向く向きを計算
          local up = Vector3.__new(direction.x,0,direction.z)
          local lookAt = Quaternion.LookRotation(up,Vector3.up) 
          camera.SetRotation(lookAt)
        end
        -- カメラを移動する
        camera.SetPosition(ITEM.RefCameraAll.GetPosition())
      end
    end
    
    ③ 카메라를 손잡이로 돌리기
    주로 다음과 같은 방식으로 실현된다.카메라 조작은 차주만 할 수 있기 때문에 정보를 사용했다
    ・ 사용자 id로 현재 누구를 대상으로 관리하는지 (소유자의 변수로 관리)
    • 표 디자인 후 정보를 통해 사용자의 ID와 좌표를 증정
    • 정보를 받은 후 id 정보를 보고 현재 사용 중인 사용자인지 판단한 후 축소 여부를 전환합니다
    function onUse(use)
      -- テーブルuse
      if use == ITEM.DonutsTable.GetName() then
        local avatar = vci.studio.GetLocalAvatar()
        if avatar then
          -- メッセージで押した人の情報変換してを送る。変換関数は後述
          vci.message.Emit(MESSAGE.USE_CAMERA_SWITCHER,convertAvatarToJson(avatar))
        end
      end
    end
    
    function MS_UseCameraSwitcher(sender, name, data)
     -- 受け取ったデータをアバター情報に変換(後述)
      local avatar= convertJsonToAvatar(data)
    
      ---今誰を向いているかはtargetNoにIDを入れることで管理
      if Owner.targetNo == avatar.id then
        SetCameraAll(avatar.pos)
        Owner.targetNo = nil
      else
        SetCameraUp(avatar.pos)
        Owner.targetNo = avatar.id
      end
    end
    vci.message.On(MESSAGE.USE_CAMERA_SWITCHER, MS_UseCameraSwitcher)
    
    
    정보는 가상 이미지 정보를 직접 보낼 수 없기 때문에 보내고 받을 때 다음과 같은 내용으로 전환된다.
    function convertAvatarToJson(avatar)
      local targetPos = avatar.GetLocalPosition()
      return {
        id = avatar.GetId(),
        pos = {
          x = targetPos.x,
          y = targetPos.y,
          z = targetPos.z
        }
      }
    end
    
    function convertJsonToAvatar(json)
      return {
        id = json.id,
        pos = Vector3.__new(json.pos.x,json.pos.y,json.pos.z)
      }
    end
    
    끝맺다
    이번에는 소개를 안 했지만 운영하면서 반납하고 싶은 일이 있어 테이블 이외에 진행자는 카메라를 자유롭게 돌려받을 수 있는 버튼만 만들었다.
    이번에 제작된 VCC가 공개될 예정이니 참가자 여러분의 협조를 부탁드리며 좋은 기획을 이루도록 하겠습니다!!

    좋은 웹페이지 즐겨찾기