Loops 为什么Vector3没有更新Unity3d

Loops 为什么Vector3没有更新Unity3d,loops,unity3d,vector,raycasting,spherical-coordinate,Loops,Unity3d,Vector,Raycasting,Spherical Coordinate,我已经失去理智有一段时间了。只需忽略注释掉的部分(不是问题)。我正在尝试进行360度经度和180度经度扫描,然后进行光线投射。但很明显,方向向量(在本例中为Dir)被固定在(0,0,-1)。我检查了xy和z值,它们工作正常。我现在不知道怎么了。请在我自杀之前回答我。叹息 { Vector3 Dir=新的Vector3(0.0f,0.0f,0.0f); 输出=新纹理2d(2160180); 对于(int i=0;i

我已经失去理智有一段时间了。只需忽略注释掉的部分(不是问题)。我正在尝试进行360度经度和180度经度扫描,然后进行光线投射。但很明显,方向向量(在本例中为Dir)被固定在(0,0,-1)。我检查了xy和z值,它们工作正常。我现在不知道怎么了。请在我自杀之前回答我。叹息

{
Vector3 Dir=新的Vector3(0.0f,0.0f,0.0f);
输出=新纹理2d(2160180);
对于(int i=0;i<1080;i++)
{
浮点数θ=(Mathf.Deg2Rad*i*1.0f)/6.0f;
对于(int j=0;j<2160;j++)
{
浮点数φ=(Mathf.Deg2Rad*j)/6.0f;
浮点x=数学正弦(θ)*数学余弦(φ);
浮点数y=数学正弦(θ)*数学正弦(φ);
浮点z=数学余弦(θ);
Dir=新矢量3(x,y,z);
Debug.Log(x+“”+y+“”+z);
/*RaycastHit RaycastHit;
if(Physics.Raycast(transform.position,Dir,out Raycast hit))
{
渲染器rend=raycastHit.transform.GetComponent();
Texture2D tex=rend.material.main纹理作为Texture2D;
Vector2 pCoord=raycastHit.textureCoord;
pCoord.x*=tex.width;
pCoord.y*=特高;
Color Color=tex.GetPixel((int)(pCoord.x*rend.material.mainturescale.x),(int)(pCoord.y*rend.material.mainturescale.y));
输出设置像素(j,i,颜色);
Debug.Log(“光线击中一个对象!@theta”+i.ToString()+“phi”+j.ToString()+“颜色:”+Color.ToString()+“命中坐标x:”+pCoord.x+“y:+pCoord.y”);
}
*/
}
}
//System.IO.File.writealBytes(“D:\\FYProject\\WebcamSnaps\\”+naming+“.png”,Output.EncodeToPNG());
}

在您的一条评论中,您表示“在任何迭代中,我只得到了(0,0,-1)。”

您的代码有一个迭代因子为1080的外部循环。内部循环的迭代因子为2160。总的来说,您的组合循环产生2332800个输出值。我不相信您验证了超过两百万条调试语句的输出。我认为您检查了最后几十个值,一次又一次地看到相同的输出,并假设该模式一直延续到链的上游。那是你的第一个错误

第二个错误是假设格式化功能是一个bug,浪费了几个小时

Vector3.ToString()
将其输出舍入到小数点后一位。如果单独打印组件,它们将显示您所期望的内容


我很同情你。

你所说的“停留在
(0,0,-1)
”是什么意思?调用
Dir=new Vector3(x,y,z);
?你的代码看起来不错,但作为优化,我会在Vector3上重新分配x,y和z,而不是每次循环迭代都创建一个新的我的意思是,在任何迭代中,除了(0,0,-1),我什么也得不到。Dir的值保持不变。它和你说的一样。我在写这篇文章之前尝试过重新分配,但仍然得到相同的结果。我获取了你的代码并运行它和
(0,0,-1)
您提到的卡住没有发生。循环中的方向值会相应地改变。另一个问题是行为是否符合要求,但循环中的值会相应地改变,
Dir
向量也会相应地改变,因此我会检查日志,以防您在控制台上记录其他内容。OK,我这样做了一点测试,我认为你的数学有点不正确(不是最好的数学)但我发现:你的x,y和z值是0,0,1,而
θ等于0。在你的第一次2160次迭代中,θ将是0,只有在它上升之后,你在x,y和z上会有不同的值。Dir向量被固定在0,0,1,而θ在第一次迭代中应该是0。θ为0意味着最大海拔。我面临的问题是,dir向量在任何迭代中都不会改变值。它停留在第一个计算值上。关于数学,它来自坐标系教科书,所以我认为它不会错。在这一点上,我确信它只是在搞乱我。
    {
        Vector3 Dir = new Vector3(0.0f, 0.0f, 0.0f);
        Output = new Texture2D(2160, 1080);
        for (int i = 0; i < 1080; i++)
        {
            float theta = (Mathf.Deg2Rad * i * 1.0f) / 6.0f;
            for (int j = 0; j < 2160; j++)
            {
                float phi = (Mathf.Deg2Rad * j) / 6.0f;
                float x = Mathf.Sin(theta) * Mathf.Cos(phi);
                float y = Mathf.Sin(theta) * Mathf.Sin(phi);
                float z = Mathf.Cos(theta);
                Dir = new Vector3(x, y, z);
                Debug.Log(x + " " + y + " " + z);
                /* RaycastHit raycastHit;
                if (Physics.Raycast(transform.position, Dir, out raycastHit))
                {
                    Renderer rend = raycastHit.transform.GetComponent<MeshRenderer>();
                    Texture2D tex = rend.material.mainTexture as Texture2D;
                    Vector2 pCoord = raycastHit.textureCoord;
                    pCoord.x *= tex.width;
                    pCoord.y *= tex.height;
                    Color color = tex.GetPixel((int)(pCoord.x * rend.material.mainTextureScale.x), (int)(pCoord.y * rend.material.mainTextureScale.y));
                    Output.SetPixel(j, i, color);
                    Debug.Log("Ray hit an object! @  theta " + i.ToString() + " phi " + j.ToString() + " Color: " + color.ToString() + "Hit Coordinate x: " + pCoord.x + " y: " + pCoord.y);
                }
                */
            }
        }
        //System.IO.File.WriteAllBytes("D:\\FYProject\\WebcamSnaps\\" + naming + ".png", Output.EncodeToPNG());
    }