No hack, no work • UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】のSphere100.fbxを利用して全天球画像を表示しているがRayキャスティングを実施しても反応がなかったので対応した。
ここでは対応方法をメモする。
参考サイト
- Sphere collider invert? - Unity Answers
- Sphere100.fbxではなくSphereを利用する場合はリンク先の方法でOK
- How do I duplicate a mesh asset? | Unity Community
原因
Colliderが外向きからしか反応しない。
内側からだと当たり判定が存在しない。
対応方法
- Sphere100にMesh Colliderコンポーネントを追加する
- Sphere100に以下のスクリプトを設定する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ReverseNormals2 : MonoBehaviour {
// Use this for initialization
void Start()
{
MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;
if (filter != null)
{
Mesh mesh = CopyMesh(filter.mesh);
Vector3[] normals = mesh.normals;
for (int i = 0; i < normals.Length; i++)
normals[i] = -normals[i];
mesh.normals = normals;
for (int m = 0; m < mesh.subMeshCount; m++)
{
int[] triangles = mesh.GetTriangles(m);
for (int i = 0; i < triangles.Length; i += 3)
{
int temp = triangles[i + 0];
triangles[i + 0] = triangles[i + 1];
triangles[i + 1] = temp;
}
mesh.SetTriangles(triangles, m);
}
}
this.GetComponent<MeshCollider>().sharedMesh = filter.mesh;
}
// Update is called once per frame
void Update () {
}
public Mesh CopyMesh(Mesh mesh)
{
var copy = new Mesh();
foreach (var property in typeof(Mesh).GetProperties())
{
if (property.GetSetMethod() != null && property.GetGetMethod() != null)
{
property.SetValue(copy, property.GetValue(mesh, null), null);
}
}
return copy;
}
}