- Home /
Generating rays from cameras with custom projection matrices
Hi there, I'm trying to generate a ray from a camera that has a custom projection matrix applied to it. I'm currently trying using the following code but I'm at the limit of my matrix math abilities so I'm having a hard time debugging whats going wrong.
Camera Code (csharp):
Camera.main.ResetProjectionMatrix ();
Matrix4x4mat = Camera.main.projectionMatrix;
Matrix4x4shearMatrix = Matrix4x4.identity;
shearMatrix.SetRow (1, newVector4 (0,1,2,0));
mat *= shearMatrix;
Camera.main.projectionMatrix = mat;
Raycast Code Code (csharp):
Vector3viewportPoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);
RaycastHithit;
Rayray = Camera.main.ScreenPointToRay(Camera.main.projectionMatrix.inverse * viewportPoint);
if (Physics.Raycast(ray, outhit))
{
...
}
I've seen similar questions asked but no answers, does anybody know what I could try next?
Answer by jonathan_topf · May 22, 2015 at 12:07 PM
I ended up getting a genius friend to help and we came up with this
usingUnityEngine;
usingSystem.Collections;
public classShearCameraMatrix : MonoBehaviour
{
public float shear = 1f;
public float sheerOffsetFactor = 60f;
Camera_camera;
Matrix4x4 OriginalProj;
Matrix4x4 ShearMat;
void Start ()
{
SetSkew ();
_camera = GetComponent<Camera> ();
}
void SetSkew ()
{
Camera.main.ResetProjectionMatrix ();
Matrix4x4 mat = Camera.main.projectionMatrix;
OriginalProj = mat;
Matrix4x4 shearMatrix = Matrix4x4.identity;
shearMatrix.SetRow (1, newVector4 (0,1,shear,shear * sheerOffsetFactor));
ShearMat = shearMatrix;
mat *= shearMatrix;
Camera.main.projectionMatrix = mat;
}
Vector3 ScreenToWorld(Vector3screenPos)
{
Vector4 ScreenPosH = screenPos;
ScreenPosH.w = 1.0f;
Vector4 WorldPos = _camera.worldToCameraMatrix.inverse * ShearMat.inverse * OriginalProj.inverse * ScreenPosH;
return WorldPos;
}
public RayScreenPointToRay(Vector3screenPos)
{
Vector3 rasterizedScreen = screenPos;
rasterizedScreen.x /= _camera.pixelWidth;
rasterizedScreen.y /= _camera.pixelHeight;
rasterizedScreen.z = 0.0f;
rasterizedScreen *= 2.0f;
rasterizedScreen -= Vector3.one;
Vector3screen1 = rasterizedScreen;
screen1.z = 0.0f;
Vector3screen2 = rasterizedScreen;
screen2.z = -1;
Vector3 world1 = ScreenToWorld(screen1);
Vector3 world2 = ScreenToWorld(screen2);
Ray ray = newRay (world2, world1 - world2);
return ray;
}
}
Your answer
Follow this Question
Related Questions
Flipping projection matrix problem: It flips everything but the Skybox. How do I fix this? 1 Answer
Custom Camera Projection Matrix that "Horizontally Compresses" worldview 1 Answer
Setting the camera projection matrix does nothing 0 Answers
How do I calculate a view matrix using Matrix4x4.LookAt? 2 Answers
Does the projection matrix calculation affect the shader? 1 Answer