Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Phorj · Jun 15, 2021 at 07:37 AM · c#raycasthitmeshesmesh verticesmesh manipulation

Line of Sight using Mesh ,Line of Sight Mesh

I am making a Line of Sight (LOS) system using a mesh.

The mesh is partially working. It works in the sense that it detects collisions with the raycast.point however the raycast.point does not align with the actual mesh.

I'm at a bit of a loss as to what's happening, as any changes I make makes it worse and/or breaks it.

Any help would be greatly appreciated!

 [SerializeField] Rigidbody rb;
 // Start is called before the first frame update
 void Start()
 {
     
 }

 // Update is called once per frame
 void Update()
 {
     Vector3 origin = Vector3.zero;
     Mesh mesh = new Mesh();
     GetComponent<MeshFilter>().mesh = mesh;

     float fov = 90f;

     int rayCount = 50;
     float angle = 0f;
     float angleIncrease = fov / rayCount;
     float viewDistance = 50f;

     Vector3[] vertices = new Vector3[rayCount + 1 + 1];
     Vector2[] uv = new Vector2[vertices.Length];
     int[] triangles = new int[rayCount * 3];

     vertices[0] = origin;

     int vertexIndex = 1;
     int triangleIndex = 0;

     for (int i = 0; i <= rayCount; i++)
     {
         Vector3 vertex = origin + GetVectorFromAngle(angle) * viewDistance;
         RaycastHit rayCastHit;
         Physics.Raycast(origin, GetVectorFromAngle(angle) * viewDistance, out rayCastHit);
         Debug.DrawRay(origin, GetVectorFromAngle(angle) * viewDistance, Color.blue);


         if (rayCastHit.collider == null)
         {
             Debug.Log("no hit");
             vertex =  origin + GetVectorFromAngle(angle)* viewDistance;
         }
         else
         {
             Debug.Log("hit");
             vertex = rayCastHit.point;
         }
         vertices[vertexIndex] = vertex;

         if (i > 0)
         {
             triangles[triangleIndex + 0] = 0;
             triangles[triangleIndex + 1] = vertexIndex - 1;
             triangles[triangleIndex + 2] = vertexIndex;

             triangleIndex += 3;
         }
         vertexIndex++;

         angle -= angleIncrease;
     }


     mesh.vertices = vertices;
     mesh.uv = uv;
     mesh.triangles = triangles;
 }

 public static Vector3 GetVectorFromAngle(float angle)
 {
     float angleRad = angle * (Mathf.PI / 180f);
     return new Vector3(Mathf.Cos(angleRad), 0, Mathf.Sin(angleRad));
 }

}

meshlos.png (17.8 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by RoopeKT · Jun 15, 2021 at 05:06 PM

For me your code works as long as the gameobject with the script has position (0,0,0), scale (1,1,1) and rotation (0,0,0).

If you want it to work with any position, you need to keep in mind that Physics.Raycast works in world space while vertex positions are in local space (coordinates are relative to the gameobject).

I modified your code to allow moving it:

 [SerializeField] Rigidbody rb;
 // Start is called before the first frame update
 void Start()
 {

 }
 // Update is called once per frame
 void Update()
 {
     Vector3 origin = transform.position;//MODIFICATION: gameobject's position in world space
     Mesh mesh = new Mesh();
     GetComponent<MeshFilter>().mesh = mesh;
     float fov = 90f;
     int rayCount = 50;
     float angle = 0f;
     float angleIncrease = fov / rayCount;
     float viewDistance = 50f;
     Vector3[] vertices = new Vector3[rayCount + 1 + 1];
     Vector2[] uv = new Vector2[vertices.Length];
     int[] triangles = new int[rayCount * 3];

     vertices[0] = Vector3.zero;//MODIFICATION: this is in local space
     int vertexIndex = 1;
     int triangleIndex = 0;

     for (int i = 0; i <= rayCount; i++)
     {
         Vector3 vertex;//MODIFICATION
         RaycastHit rayCastHit;
         bool hit = Physics.Raycast(origin, GetVectorFromAngle(angle) * viewDistance, out rayCastHit);
         Debug.DrawRay(origin, GetVectorFromAngle(angle) * viewDistance, Color.blue);
         if (!hit)//MODIFICATION: recommended way to check if the raycast hit something
         {
             Debug.Log("no hit");
             vertex = GetVectorFromAngle(angle) * viewDistance;//MODIFICATION: local space, relative to this gameobject
         }
         else
         {
             Debug.Log("hit");
             vertex = rayCastHit.point - origin;//MODIFICATION: subtract origin to get into local space
         }
         vertices[vertexIndex] = vertex;

         if (i > 0)
         {
             triangles[triangleIndex + 0] = 0;
             triangles[triangleIndex + 1] = vertexIndex - 1;
             triangles[triangleIndex + 2] = vertexIndex;
             triangleIndex += 3;
         }
         vertexIndex++;

         angle -= angleIncrease;
     }
     mesh.vertices = vertices;
     mesh.uv = uv;
     mesh.triangles = triangles;
 }
 public static Vector3 GetVectorFromAngle(float angle)
 {
     float angleRad = angle * (Mathf.PI / 180f);
     return new Vector3(Mathf.Cos(angleRad), 0, Mathf.Sin(angleRad));
 }

If the gameobject has also rotation and/or scale, you can switch between world and local space using Transform.TransformPoint and Transform.InverseTransformPoint.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by Vincent011 · Jul 13, 2021 at 01:08 PM

@RoopeKT, Thank you so much for the solution. I made a little change to make it fit for my game and want to share it for the people in need.

 //2D modification: made it easy to change values during runtime to do some tests.
     [SerializeField] LayerMask layerMask;
     [Range(0,360)][SerializeField] private float fov = 90f;
     [SerializeField] private int rayCount = 50;
     [SerializeField] private float viewDistance = 50f;
 
     void Update()
     {
         Mesh mesh = new Mesh();
         GetComponent<MeshFilter>().mesh = mesh;
 
         Vector2 origin = transform.position;//2D Modification: changed to vector2
         Vector3[] vertices = new Vector3[rayCount + 1 + 1];
         Vector2[] uv = new Vector2[vertices.Length];
         int[] triangles = new int[rayCount * 3];
 
         float angle = 0f;
         float angleIncrease = fov / rayCount;
         int vertexIndex = 1;
         int triangleIndex = 0;
         vertices[0] = Vector3.zero;
 
         for (int i = 0; i <= rayCount; i++)
         {
             Vector3 vertex;
             //2D Modification: changed raycast to 2D version and gave it a layermask for detecting walls.
             RaycastHit2D hit = Physics2D.Raycast(origin, GetVectorFromAngle(angle), viewDistance, layerMask); 
             if (!hit)                                                                                         
             {
                 vertex = GetVectorFromAngle(angle) * viewDistance;
             }
             else
             {
                 vertex = hit.point - origin;
             }
             vertices[vertexIndex] = vertex;
             if (i > 0)
             {
                 triangles[triangleIndex + 0] = 0;
                 triangles[triangleIndex + 1] = vertexIndex - 1;
                 triangles[triangleIndex + 2] = vertexIndex;
                 triangleIndex += 3;
             }
             vertexIndex++;
             angle -= angleIncrease;
         }
         mesh.vertices = vertices;
         mesh.uv = uv;
         mesh.triangles = triangles;
     }
     public static Vector3 GetVectorFromAngle(float angle)
     {
         float angleRad = angle * (Mathf.PI / 180f);
         return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad), 0); //2D Modification: placed Mathf.Sin to be on Y (not necessary, see below pictures for the difference).
     }

alt text

alt text

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

720 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Sort a list based on edge connections 1 Answer

can somebody explain to me what is going on in this script ?? 1 Answer

How to Cut any Mesh and Put Jelly like Behaviour in the generated Cut Meshes? 0 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges