「毎日Unity」の技術ブログ

開発で役立つ情報を発信する

【UnityC#】オブジェクトの法線を可視化する方法

オブジェクトの法線を可視化する方法をメモ。

[ 方法 ]

以下のコードを法線を可視化したいオブジェクトにアタッチします。

using UnityEngine;

[ExecuteInEditMode]

public class script : MonoBehaviour
{
    private float length = 1;

    private void Update() 
    {
        MeshFilter meshFilt = GetComponent<MeshFilter>();
        
        Mesh mesh = meshFilt.sharedMesh;

        Vector3[] localVerts = mesh.vertices;
        Vector3[] localNormals = mesh.normals;
        
        for (int i = 0; i < localVerts.Length; i++)
        {
            Vector3 localVert = localVerts[i];
            Vector3 localNormal = localNormals[i];

            Vector3 worldVert = transform.TransformPoint(localVert);
            Vector3 worldNormal = transform.TransformDirection(localNormal);

            Debug.DrawLine(worldVert, worldVert + worldNormal * length, Color.red);
        }
    }
}

[ 関連記事 ]

【UnityC#】3次元空間で直線ABと直線CDが交差するか判定する方法

3次元空間で直線ABと直線CDが交差するか判定する方法をメモ。

[ 方法 ]

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

public class script : MonoBehaviour
{
    // 直線ABと直線CDが交差するかを求める関数
    private bool IsStraightLineOnStraightLine(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
    {
        Vector3 vecAB = b - a;
        Vector3 vecCD = d - c;

        Vector3 cross = Vector3.Cross(vecAB, vecCD);

        return cross.magnitude < 0.00001f;
    }
}

【UnityC#】3次元空間で直線ABと点Pの距離を求める方法

3次元空間で直線ABと点Pの距離を求める方法をメモ。

[ 方法 ]

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

public class script : MonoBehaviour
{
    // 点Pから最も近い直線AB上に存在する点を求める関数
    private Vector3 ClosestPointOnStraightLine(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 vecAB = b - a;
        Vector3 vecAP = p - a;

        Vector3 closestPos = a + Vector3.Project(vecAP, vecAB);

        return closestPos;
    }

    // 直線ABと点Pの距離を求める関数
    private float DistBetweenPointAndStraightLine(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 closestPoint = ClosestPointOnStraightLine(a, b, p);

        float dist = Vector3.Distance(closestPoint, p);

        return dist;
    }
}

【UnityC#】3次元空間で点Pから最も近い直線AB上に存在する点を求める方法

3次元空間で点Pから最も近い直線AB上に存在する点を求める方法をメモ。

[ 方法 ]

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

public class script : MonoBehaviour
{
    // 点Pから最も近い直線AB上に存在する点を求める関数
    private Vector3 ClosestPointOnStraightLine(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 vecAB = b - a;
        Vector3 vecAP = p - a;

        Vector3 closestPos = a + Vector3.Project(vecAP, vecAB);

        return closestPos;
    }
}

【UnityC#】3次元空間で線分ABと点Pの距離を求める方法

3次元空間で線分ABと点Pの距離を求める方法をメモ。

[ 方法 ]

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

public class script : MonoBehaviour
{
    // 点Pから最も近い線分AB上に存在する点を求める関数
    private Vector3 ClosestPointOnLineSegment(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 vecAB = b - a;
        Vector3 vecAP = p - a;

        float mag = vecAB.magnitude;

        Vector3 unitVecAB = vecAB.normalized;

        float dot = Vector3.Dot(vecAP, unitVecAB);

        dot = Mathf.Clamp(dot, 0f, mag);

        return a + unitVecAB * dot;
    }

    // 線分ABと点Pの距離を求める関数
    private float DistBetweenPointAndLineSegment(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 closestPoint = ClosestPointOnLineSegment(a, b, p);

        float dist = Vector3.Distance(closestPoint, p);

        return dist;
    }
}

【UnityC#】3次元空間で点Pから最も近い線分AB上に存在する点を求める方法

3次元空間で点Pから最も近い線分AB上に存在する点を求める方法をメモ。

[ 方法 ]

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

public class script : MonoBehaviour
{
    // 点Pから最も近い線分AB上に存在する点を求める関数
    private Vector3 ClosestPointOnLineSegment(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 vecAB = b - a;
        Vector3 vecAP = p - a;

        float mag = vecAB.magnitude;

        Vector3 unitVecAB = vecAB.normalized;

        float dot = Vector3.Dot(vecAP, unitVecAB);

        dot = Mathf.Clamp(dot, 0f, mag);

        return a + unitVecAB * dot;
    }
}

【UnityC#】3次元空間で直線AB上に点Pが存在するか判定する方法

3次元空間で直線AB上に点Pが存在するか判定する方法をメモ。

[ 方法 ]

using System.Collections;https://edunity.hatenablog.com/entry/20250616/1750064834
using System.Collections.Generic;
using UnityEngine;

public class script : MonoBehaviour
{
    // 直線AB上に点Pが存在するかを求める関数
    private bool IsPointOnStraightLine(Vector3 a, Vector3 b, Vector3 p)
    {
        Vector3 vecAB = b - a;
        Vector3 vecAP = p - a;

        Vector3 cross = Vector3.Cross(vecAB, vecAP);

        float mag = cross.magnitude;

        return mag < 0.00001f;
    }
}