I can’t find the solution for this error message “Screen position out of view frustum (screen pos nan, nan, nan) (Camera rect 0 0 1170 2532)
UnityEngine.Camera:ScreenToWorldPoint (UnityEngine.Vector3)”
For details, I can run my scene with AR Foundation Remote at the first time when I open the unity project. Also I can install this scene into ios device and it works fine. But from second time I runned it, it outs this error every frame everytime.
I can understand nan value is continuously into the ScreentoWorldPoint() but wonder if first time running is always success. So I want to know how to keep the first time condition at least.
my env info
macbook pro 2019 15inch
unity 2021 3.18.f1
using AR Foundation Remote 1.4.30-release.2
using HandPoseBarracuda
following code is one of the main script in my project.
private void updateHandPose()
{
for (int i = 0; i < HandPipeline.KeyPointCount; i++)
{
if(i == 3 || i == 4 || i == 9 || i == 12 || i == 17 || i == 20 || i == 8)
{
var position = _pipeline.GetKeyPoint(i);
// Debug.Log("position: " + position);
var keyPoint = (HandPipeline.KeyPoint)i;
int paramIndex = 0;
switch (currentFilterType)
{
case FilterType.Kalman:
paramIndex = 0;
// カルマンフィルタを適用
foreach (float noise in kalmanParameters)
{
_kalmanFilters[keyPoint].SetKalmanParameter(noise, processNoise);
var kalmanPosition = _kalmanFilters[keyPoint].UpdateEstimate(position);
if (kalmanPositions.Count <= paramIndex)
{
kalmanPositions.Add(new List<Vector3>());
}
kalmanPositions[paramIndex].Add(kalmanPosition);
paramIndex++;
}
break;
case FilterType.EMA:
paramIndex = 0;
// EMAフィルタを適用
foreach (float factor in emaParameters)
{
_emaFilters[keyPoint].SetEMAParameter(factor);
var emaPosition = _emaFilters[keyPoint].UpdateEstimate(position);
if (emaPositions.Count <= paramIndex)
{
emaPositions.Add(new List<Vector3>());
}
emaPositions[paramIndex].Add(emaPosition);
paramIndex++;
}
break;
case FilterType.OneEuro:
paramIndex = 0;
// 1ユーロフィルタを適用
foreach (float beta in oneEuroParameters)
{
_oneEuroFilters[keyPoint].SetOneEuroParameters(beta, fc_min);
var oneEuroPosition = _oneEuroFilters[keyPoint].UpdateEstimate(position);
if (oneEuroPositions.Count <= paramIndex)
{
oneEuroPositions.Add(new List<Vector3>());
}
oneEuroPositions[paramIndex].Add(oneEuroPosition);
paramIndex++;
}
break;
}
if (i == 8)
{
List<string> dataForSmoothingList = new List<string>
{
framecount.ToString(),
position.x.ToString()
};
List<List<Vector3>> currentFilterPositions = null;
switch (currentFilterType)
{
case FilterType.Kalman:
currentFilterPositions = kalmanPositions;
break;
case FilterType.EMA:
currentFilterPositions = emaPositions;
break;
case FilterType.OneEuro:
currentFilterPositions = oneEuroPositions;
break;
}
if (currentFilterPositions != null)
{
foreach (var posList in currentFilterPositions)
{
dataForSmoothingList.Add(posList[posList.Count - 1].x.ToString());
}
dataForSmoothingList.Add("");
dataForSmoothingList.Add(position.y.ToString());
foreach (var posList in currentFilterPositions)
{
dataForSmoothingList.Add(posList[posList.Count - 1].y.ToString());
}
dataForSmoothingList.Add("");
dataForSmoothingList.Add(position.z.ToString());
foreach (var posList in currentFilterPositions)
{
dataForSmoothingList.Add(posList[posList.Count - 1].z.ToString());
}
}
csvExporter.SaveToCSV(dataForSmoothingList.ToArray());
}
Vector3 smoothing_position;
switch (currentFilterType)
{
case FilterType.Kalman:
smoothing_position = kalmanPositions[0][kalmanPositions[0].Count - 1];
break;
case FilterType.EMA:
smoothing_position = emaPositions[0][emaPositions[0].Count - 1];
break;
case FilterType.OneEuro:
smoothing_position = oneEuroPositions[0][oneEuroPositions[0].Count - 1];
break;
default:
smoothing_position = position; // または適切なデフォルト値
break;
}
//ワールド座標に変換する
float xPos = Screen.width * normalize(smoothing_position.x, -0.5f, 0.5f);
float yPos = Screen.height * normalize(smoothing_position.y, -0.5f, 0.5f);
// Debug.Log("width" + Screen.width);
// Debug.Log("height" + Screen.height);
float zPos = 0.3f + smoothing_position.z;
Vector3 cameraPos = new Vector3(xPos, yPos, zPos);
// Debug.Log($"cameraPos: {cameraPos}");
// if (Camera.main != null && !float.IsNaN(cameraPos.x) && !float.IsNaN(cameraPos.y) && !float.IsNaN(cameraPos.z) && !float.IsInfinity(cameraPos.x) && !float.IsInfinity(cameraPos.y) && !float.IsInfinity(cameraPos.z))
// {
var screenPosition = Camera.main.ScreenToWorldPoint(cameraPos);
// それぞれの手のパーツに座標を代入
_handJoints[keyPoint].transform.position = screenPosition;
// }
// // ここで、zPosに基づいて、関節の大きさを調整します
// float scaleFactor = 1.0f / (zPos + 1);
// _handJoints[keyPoint].transform.localScale = Vector3.one * scaleFactor;
// 人差し指のSphereの位置と向きを基にレイを生成
if (indexTipSphere)
{
Vector3 currentPosition = indexTipSphere.transform.position;
Vector3 direction = (currentPosition - Camera.main.transform.position).normalized;
Vector3 endPos = currentPosition + direction * rayDistance;
Debug.DrawLine(currentPosition, endPos, Color.green, 2f);
// 人差し指の先端からのレイキャスティングを行う
// Debug.Log(isTriggeredwithThumb);
raycastingScript.CastRayFromIndexFinger(currentPosition, direction, i);
}
}
}
}```