void Update() { HelperPhysics.Hit hit; Vector3 point1, point2; float range = 0.3f; trans[0].RotateAround(Vector3.zero, Vector3.one, range); trans[1].RotateAround(Vector3.zero, -Vector3.one, range); trans[2].RotateAround(Vector3.zero, Vector3.one, range); trans[3].RotateAround(Vector3.zero, -Vector3.one, range); if (HelperPhysics.IntersectLineToLine(trans[0].position, trans[1].position, trans[2].position, trans[3].position, out hit, out point1, out point2)) { point.gameObject.SetActive(true); point.position = hit.point; } else { point.gameObject.SetActive(false); } if (!float.IsNaN(Vector3.Dot(point1, point2))) { dot[0].gameObject.SetActive(true); dot[1].gameObject.SetActive(true); dot[0].position = point1; dot[1].position = point2; } else { dot[0].gameObject.SetActive(false); dot[1].gameObject.SetActive(false); } }
public void SetPoint(Octree.OctreeInfo info, Vector3 line2) { for (int i = 0; i < info.lsVertex.Count; i += 3) { Vector3 edge1 = info.GetWorldPosition(info.lsVertex[i]); Vector3 edge2 = info.GetWorldPosition(info.lsVertex[i + 1]); Vector3 edge3 = info.GetWorldPosition(info.lsVertex[i + 2]); HelperPhysics.Hit hit3; if (HelperPhysics.IntersectLineToTriangle(origin, line2, edge1, edge2, edge3, out hit3)) { _point.position = hit3.point; _point.gameObject.SetActive(true); break; } } }
void Update() { _addTime += Time.deltaTime; if (_addTime > _changeTime) { _moveDir = -_moveDir; _moveDir2 = -_moveDir2; _addTime = 0.0f; } line[0].Translate(_moveDir * Time.deltaTime); line[1].Translate(_moveDir * Time.deltaTime); line[0].Translate(-_moveDir2 * Time.deltaTime); line[1].Translate(_moveDir2 * Time.deltaTime); polygon.transform.Rotate(Vector3.one * 1.0f); List <HelperPhysics.Hit> lsHit = new List <HelperPhysics.Hit>(); for (int i = 0; i < lsTriPoint.Count; i += 3) { Vector3 edge1 = (polygon.rotation * Vector3.Scale(lsTriPoint[i], polygon.localScale) + polygon.position); Vector3 edge2 = (polygon.rotation * Vector3.Scale(lsTriPoint[i + 1], polygon.localScale) + polygon.position); Vector3 edge3 = (polygon.rotation * Vector3.Scale(lsTriPoint[i + 2], polygon.localScale) + polygon.position); HelperPhysics.Hit hit3; if (HelperPhysics.IntersectLineToTriangle(line[0].position, line[1].position, edge1, edge2, edge3, out hit3)) { lsHit.Add(hit3); } } for (int i = 0; i < point.Length; ++i) { point[i].gameObject.SetActive(false); } for (int i = 0; i < lsHit.Count; ++i) { point[i].gameObject.SetActive(true); point[i].position = lsHit[i].point; } }
private bool BoxCast(Ray ray, Octree.OctreeInfo octreeInfo, Vector3 origin, Vector3 line2, out HelperPhysics.Hit hit) { hit = new HelperPhysics.Hit(); for (int i = 0; i < _indexBuffers.Length; i += 3) { Vector3 edge1 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i]]); Vector3 edge2 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i + 1]]); Vector3 edge3 = octreeInfo.GetVertexPosition(_boxVertices[_indexBuffers[i + 2]]); HelperPhysics.Hit hit1; if (HelperPhysics.IntersectLineToTriangle(origin, line2, edge1, edge2, edge3, out hit1)) { Vector3 dir1 = edge2 - edge1; Vector3 dir2 = edge3 - edge2; float dot = Vector3.Dot(ray.direction, Vector3.Cross(dir1, dir2)); if (dot < 0.0f) { hit = hit1; if (octreeInfo.lsChild.Count <= 0) { _lsOctreeInfo.Add(octreeInfo); } for (int k = 0; k < octreeInfo.lsChild.Count; ++k) { HelperPhysics.Hit hit2; if (BoxCast(ray, octreeInfo.lsChild[k], hit1.point, line2, out hit2)) { hit = hit2; } } return(true); } } } return(false); }
void AddVertex() { Vector3[] boxVertices = octree._boxVertices; int[] indexBuffers = octree._indexBuffers; Vector3[] checkPos = new Vector3[indexBuffers.Length]; for (int i = 0; i < indexBuffers.Length; i++) { checkPos[i] = GetVertexPosition(boxVertices[indexBuffers[i]]); } Vector3[] checkPos2 = new Vector3[6]; checkPos2[0] = GetVertexPosition(new Vector3(-1, 0, 0)); checkPos2[1] = GetVertexPosition(new Vector3(1, 0, 0)); checkPos2[2] = GetVertexPosition(new Vector3(0, -1, 0)); checkPos2[3] = GetVertexPosition(new Vector3(0, 1, 0)); checkPos2[4] = GetVertexPosition(new Vector3(0, 0, -1)); checkPos2[5] = GetVertexPosition(new Vector3(0, 0, 1)); Mesh mesh = octree.GetComponent <MeshFilter>().mesh; Vector3[] vertices = mesh.vertices; int[] tri = mesh.triangles; for (int i = 0; i < tri.Length; i += 3) { Vector3 edge1 = vertices[tri[i]]; Vector3 edge2 = vertices[tri[i + 1]]; Vector3 edge3 = vertices[tri[i + 2]]; for (int k = 0; k < checkPos.Length; k += 3) { Vector3 ver1 = checkPos[k]; Vector3 ver2 = checkPos[k + 1]; Vector3 ver3 = checkPos[k + 2]; HelperPhysics.Hit hit; if (HelperPhysics.IntersectLineToTriangle(ver1, ver2, edge1, edge2, edge3, out hit) || HelperPhysics.IntersectLineToTriangle(ver2, ver3, edge1, edge2, edge3, out hit) || HelperPhysics.IntersectLineToTriangle(ver3, ver1, edge1, edge2, edge3, out hit)) { lsVertex.Add(edge1); lsVertex.Add(edge2); lsVertex.Add(edge3); } } for (int k = 0; k < 3; ++k) { Vector3 edge = vertices[tri[i + k]]; if (checkPos2[0].x <= edge.x && checkPos2[1].x >= edge.x && checkPos2[2].y <= edge.y && checkPos2[3].y >= edge.y && checkPos2[4].z <= edge.z && checkPos2[5].z >= edge.z) { Vector3 tri1 = mesh.vertices[tri[i]]; Vector3 tri2 = mesh.vertices[tri[i + 1]]; Vector3 tri3 = mesh.vertices[tri[i + 2]]; lsVertex.Add(tri1); lsVertex.Add(tri2); lsVertex.Add(tri3); break; } } } }