anonymous No title
No License C++
2021年05月27日
Copy Clone
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Script to reflect OpenCV extrinsic parameters to the object.
/// * Detail
///     The object attached this script will be translated based on the attitude of the parent object.
/// * Coordinate
///     Assume that Unity coordinate and OpenCV coordinate share X / Z axises (Y axis is inversed).
///     
/// OpenCVとUnity場の座標軸が反転しているから
/// Y軸を反転させる OpenCV(1,2,3)→Unity(1,-2,3)であるとする
/// 外部パラメータを対応させる

public class OpenCVTranslate : MonoBehaviour
{
    // OpenCVでは回転ベクトル=外部パラメータの行列は、
    // 変換後→前の座標系への右回転を表したもの
    // いまは、カメラの位置を対応させるため、変換前→後の行列が欲しい・・・左回転すると考える
    // Unityでは左回転が正方向であるから、+vベクトル分だけ回転させればいい

    public float RotationX;
    public float RotationY;
    public float RotationZ;

    public float TranslationX;
    public float TranslationY;
    public float TranslationZ;

    void Start()
    {
        
    }

    void Update()
    {
        // 外部パラメータの回転成分に関わる話
        //var rod = new Vector3(RotationX, RotationY, -RotationZ); //先生のコード出力する時点でマイナスになっているかも だからUnity上で反転させないOpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        //var rod = new Vector3(RotationX, RotationY, RotationZ); //先生のコード出力する時点でマイナスになっているかも だからUnity上で反転させないOpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        var rod = new Vector3(RotationX, -RotationY, RotationZ); //OpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        this.transform.localRotation = Quaternion.AngleAxis(rod.magnitude * 180 / Mathf.PI, rod); //回転量を定義している 後→前を前→後で座標変わって結局+で表される

        // 外部パラメータの並進移動に関わる話
        // OpenCVから取得できる並進ベクトルは、(後→前)変換後の座標系原点から変換前の座標系原点までの距離を回転後の座標系において表現したもの
        var xdir = this.transform.localRotation * Vector3.right;
        var ydir = this.transform.localRotation * Vector3.up;
        var zdir = this.transform.localRotation * Vector3.forward;
        this.transform.localPosition = xdir * TranslationX - ydir * TranslationY + zdir * TranslationZ; //並進させるのは反対の動きをするようにしてY軸は座標系がOpenCVとUnityで反対だから+に動かすことになる
        //this.transform.localPosition = -xdir * TranslationX + ydir * TranslationY - zdir * TranslationZ; //並進させるのは反対の動きをするようにしてY軸は座標系がOpenCVとUnityで反対だから+に動かすことになる

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Script to reflect OpenCV extrinsic parameters to the object.
/// * Detail
///     The object attached this script will be translated based on the attitude of the parent object.
/// * Coordinate
///     Assume that Unity coordinate and OpenCV coordinate share X / Z axises (Y axis is inversed).
///     
/// OpenCVとUnity場の座標軸が反転しているから
/// Y軸を反転させる OpenCV(1,2,3)→Unity(1,-2,3)であるとする
/// 外部パラメータを対応させる

public class OpenCVTranslate : MonoBehaviour
{
    // OpenCVでは回転ベクトル=外部パラメータの行列は、
    // 変換後→前の座標系への右回転を表したもの
    // いまは、カメラの位置を対応させるため、変換前→後の行列が欲しい・・・左回転すると考える
    // Unityでは左回転が正方向であるから、+vベクトル分だけ回転させればいい

    public float RotationX;
    public float RotationY;
    public float RotationZ;

    public float TranslationX;
    public float TranslationY;
    public float TranslationZ;

    void Start()
    {
        
    }

    void Update()
    {
        // 外部パラメータの回転成分に関わる話
        //var rod = new Vector3(RotationX, RotationY, -RotationZ); //先生のコード出力する時点でマイナスになっているかも だからUnity上で反転させないOpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        //var rod = new Vector3(RotationX, RotationY, RotationZ); //先生のコード出力する時点でマイナスになっているかも だからUnity上で反転させないOpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        var rod = new Vector3(RotationX, -RotationY, RotationZ); //OpenCVでの回転ベクトル(X,Y,Z)はUnity上では(X,-Y,Z)で表される
        this.transform.localRotation = Quaternion.AngleAxis(rod.magnitude * 180 / Mathf.PI, rod); //回転量を定義している 後→前を前→後で座標変わって結局+で表される

        // 外部パラメータの並進移動に関わる話
        // OpenCVから取得できる並進ベクトルは、(後→前)変換後の座標系原点から変換前の座標系原点までの距離を回転後の座標系において表現したもの
        var xdir = this.transform.localRotation * Vector3.right;
        var ydir = this.transform.localRotation * Vector3.up;
        var zdir = this.transform.localRotation * Vector3.forward;
        this.transform.localPosition = xdir * TranslationX - ydir * TranslationY + zdir * TranslationZ; //並進させるのは反対の動きをするようにしてY軸は座標系がOpenCVとUnityで反対だから+に動かすことになる
        //this.transform.localPosition = -xdir * TranslationX + ydir * TranslationY - zdir * TranslationZ; //並進させるのは反対の動きをするようにしてY軸は座標系がOpenCVとUnityで反対だから+に動かすことになる

    }
}
No one still commented. Please first comment.