-
Notifications
You must be signed in to change notification settings - Fork 0
/
MirrorMirrifyObject.cs
39 lines (32 loc) · 1.86 KB
/
MirrorMirrifyObject.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class MirrorMirrifyObject : MonoBehaviour
{
public GameObject objectBeforeMirror;
public GameObject mirrorPlane;
void Update ()
{
if (null != mirrorPlane) {
if (null != objectBeforeMirror) {
transform.position = objectBeforeMirror.transform.position;
transform.rotation = objectBeforeMirror.transform.rotation;
Vector3 positionInMirrorSpace = mirrorPlane.transform.InverseTransformPoint( objectBeforeMirror.transform.position );
// move camera forward
positionInMirrorSpace.y = -positionInMirrorSpace.y;
positionInMirrorSpace.z = (positionInMirrorSpace.z)/2.5f;
transform.position = mirrorPlane.transform.TransformPoint( positionInMirrorSpace );
/** object is now in correct position, but looking in parallel look direction to original */
/* So, cast a ray from the original object along look-direction until you hit the plane,
* then make the cloned object "look at" that position */
Vector3 mirrorsNormal = mirrorPlane.transform.localRotation * new Vector3( 0f, 1, 0f ); // Unity planes always start with normal pointing up
Plane planeOfMirror = new Plane( mirrorsNormal, mirrorPlane.transform.position );
float intersectionDistance;
Ray rayToMirror = new Ray( objectBeforeMirror.transform.position, objectBeforeMirror.transform.forward );
planeOfMirror.Raycast( rayToMirror, out intersectionDistance );
Vector3 hitPoint = rayToMirror.GetPoint( intersectionDistance );
transform.LookAt( hitPoint );
}
}
}
}