

Sphereを再度におき、薄くしたCylinderが中央にある状態で画像の一番上のようにSphereをつなぐ橋のような感じにしたく、LookRotationで片方のSphereを参照して向かせると画像の2番目、3番目（第二引数をforward、Rightに変更）のように意図している方向にCylinderが向いてくれません、ご教授願います。デフォルトではCylinderは中央の状態です。

[code]

    Cylinder.transform.rotation = Quaternion.LookRotation(Sphere.position - Cylinder.transform.position);
    
[/code]

[![比較](https://i.stack.imgur.com/AG3F4.png)](https://i.stack.imgur.com/AG3F4.png)


CC BY-SA 4.0
2020-11-13T10:37:16.773
71929
2020-11-17T06:01:21.470
2020-11-13T14:28:39.047
3060
40081
question
c# unity3d
オブジェクトを指定したオブジェクトの方向に向くようにしたい

  * オブジェクトの「前方」は基本的にはZ軸方向のため、シリンダーをその方向に回転させる必要がある
  * シリンダーの中心が回転の中心になるため、その位置を変更する必要がある

これを解決する方法の１つに、空のゲームオブジェクトを階層に挿入して座標系を補正する方法があります。実装例として以下に２パターンを例示します。

### A から B の方向を指すようにマーカーを表示する場合

[code]

    + CylinderRoot ... 空のゲームオブジェクト
      + Cylinder ... Position(0,0,2) Rotation(90,0,0)
    
[/code]

対象の方向を向く命令はTransformにLookAt()という簡易的な命令があるのでそれを使います。

[code]

    // at CylinderRoot
    
    public Transform A;
    public Transform B;
    
    void Update()
    {
        transform.position = A.position;
        transform.LookAt(B);
    }
    
[/code]

### A と B の中間にマーカーを表示する場合

[code]

    + CylinderRoot ... 空のゲームオブジェクト
      + Cylinder ... Rotation(90,0,0)
    
[/code]

この場合の方向はAから見たBの方向なので、LookRotation()を使います。

[code]

    // at CylinderRoot
    
    public Transform A;
    public Transform B;
    
    void Update()
    {
        transform.position = Vector3.Lerp(A.position, B.position, 0.5f);
        transform.rotation = Quaternion.LookRotation(B.position - A.position);
    }
    
[/code]


CC BY-SA 4.0
2020-11-16T11:19:22.973
71985
2020-11-17T06:01:21.470
2020-11-17T06:01:21.470
14817
14817
71929
answer