3

スクリプトから統一されたメッシュを生成しようとしています。メッシュは、特定の方向にレイキャストすることによって生成されます。次に、ヒットポイントまたは光線が終了する場所から頂点を取得します。メッシュは正常に生成され、正常に機能していますが、メッシュは、スクリプトが添付されたオブジェクトの位置の上に約5〜10単位を生成します。以下にスクリプトを添付します。

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

public class Torch : MonoBehaviour {

    public GameObject  lightmeshholder;

    private int RaysToShoot = 128;
    private float distance = 50;
    private Vector3[] vertices;
    private Vector2[] vertices2d;
    private int[] triangles;

    private Mesh mesh;

    private Texture2D texture;
    private int screenwidth;
    private int screenheight;
    private int grab = 0;

    private RaycastHit hit;


    // Use this for initialization
    void Start () {
    screenwidth = Screen.width;
    screenheight = Screen.height;
    texture = new Texture2D (screenwidth, screenheight, TextureFormat.RGB24, false);

    vertices = new Vector3[RaysToShoot];
    vertices2d = new Vector2[RaysToShoot];
    triangles = new int[(RaysToShoot) +1 ];

    mesh= lightmeshholder.GetComponent<MeshFilter>().mesh;

    }

    // Update is called once per frame
    void Update () {

        float angle =0;

            for(int i=0;i<RaysToShoot;i++){

                        float x = Mathf.Sin(0);
                        x=-5;
            if(Input.GetKey(KeyCode.P)){
                    x = 5;
            }
                        float y = Mathf.Cos(angle);
            if (angle <= 90){
                        angle += 2*Mathf.PI/RaysToShoot;
            }

            Vector3 dir = new Vector3(x,y,0);
        if (Physics.Raycast (this.transform.position, dir,out hit, distance)) 
        {
                Debug.DrawLine (this.transform.position, hit.point,new Color(1,1,0,1));
            Vector3 tmp = lightmeshholder.transform.InverseTransformPoint(hit.point);
            vertices2d[i] = new Vector2(tmp.x,tmp.y);

            }else{
            Vector3 tmp = lightmeshholder.transform.InverseTransformPoint(this.transform.position + dir*distance);
            vertices2d[i] = new Vector2(tmp.x,tmp.y);
            Debug.DrawLine(this.transform.position,dir * distance,Color.red,0); 
            }



        }

        // build mesh

    Vector2[] uvs = new Vector2[vertices2d.Length +1];
    Vector3[] newvertices = new Vector3[vertices2d.Length+1];


    for (int n = 0; n<newvertices.Length-1 ;n++) 
    {


            if(n==0){
            newvertices[0]=this.transform.position; 
                newvertices[1] = vertices2d[0];
                uvs[0] = new Vector2(this.transform.position.x,this.transform.position.y);
                uvs[1] = vertices2d[0];
            }else{
            newvertices[n+1] = vertices2d[n];   
                uvs[n+1] = vertices2d[n];
            }

            if(n==0){
                triangles[0] = 0;   
                triangles[1] = 1;
                triangles[2] = 2;
            }else if(n<newvertices.Length/3){
                triangles[n*3] = 0; 
                triangles[1+n*3] = n+1;
                triangles[2+n*3] = n+2;
            }

    }
        Mesh mesh = new Mesh(); 
        GetComponent<MeshFilter>().mesh = mesh; 
        mesh.Clear();
        mesh.vertices = newvertices;        
        mesh.uv = uvs;  
        mesh.triangles = triangles;
        mesh.RecalculateNormals();          
    }
}  
4

2 に答える 2

3

レイキャストから得られるヒットポイントはグローバルです。次のいずれかを実行できます。

1)メッシュが0,0,0に配置されているゲームオブジェクト内にあることを確認します。レイヒットポイントに基づいて動的メッシュを作成するときはいつでも、通常、0,0,0に新しい親のないゲームオブジェクトを作成し、それにメッシュを追加します。(コンテナGameObjectを外部から取得する代わりに)

2)メッシュを構築する前に、レイキャストからのヒットポイントでlightmeshholder.transform.InverseTransformPointを呼び出します

于 2012-09-06T22:15:44.500 に答える
0

頂点をメッシュに割り当てる場合、それらはオブジェクトルートを基準にしたローカル座標で計算されます。したがって、「本来あるべき場所」に戻したい場合は、.TransformPoint()呼び出しで処理して、適切なオフセットを取得します。これにより、予想とは異なる場所にあるという問題が解決するはずです。私も同じ問題を抱えていました。

于 2014-07-24T12:55:35.080 に答える