문제

나는 간단한 광선 추적기를 쓰면서 Vectormath에 대해 조금 더 배우려고 노력하고 있으며 그것을 읽을 수 없었던 것은 1 차 광선의 방향을 결정하는 방법입니다. 이것은 단순한 문제처럼 들리지만 아마도 현재의 지식으로 나는 그것을 알아낼 수 없었습니다.

카메라 (벡터로서의 위치와 방향에 지나지 않는)가 필요하다고 생각했고 카메라에서 기본 광선을 카메라 앞의 화면에 최종 이미지를 나타내는 카메라를 발사합니다. 내가 알아낼 수없는 것은 화면의 코너 좌표입니다. 화면을 알고 있다면 1 차 광선의 방향을 찾는 것이 쉽습니다.

회전 행렬이 필요하지 않은 간단한 수학 만 사용하여 화면을 알아낼 수 있기를 바랍니다. 내 가장 좋은 추측은 이것입니다 :

카메라의 방향은 벡터로서,이 방향은 투영 화면의 평면의 정상과 같습니다. 그래서 화면의 정상이 있고 거기에서 화면 중앙을 쉽게 계산할 수 있습니다.

camera_location + (normal * distance) 

거리가 화면과 카메라 사이의 거리가있는 곳. 그러나 그곳에서 내가 길을 잃은 곳이며 카메라의 임의의 방향에 대해 비행기의 코너 좌표를 파악할 수있는 방법을 찾을 수 없습니다.

여기서 나를 도울 수 있습니까? 내 방법이 작동하지 않으면 무엇을합니까?

도움이 되었습니까?

해결책

편집 : 여기에 일부 코드가 있습니다.이 코드는 뷰마 릭스 생성을 생략하기 때문에 원래 게시 된 코드에서 실질적으로 줄어 듭니다. 그것은 일부 스캔 라인 렌더링에만 필요했고 광선 추적에 사용되지 않았습니다.

어려운 일은 LookAT () 함수, 특히 'UP'및 '오른쪽'벡터의 생성입니다. 이것들은 서로 직각이어야하며, 또한 눈과 그림의 중심 사이에서 작동하는 벡터에도 있어야합니다. 이러한 벡터의 생성은 교차 제품 벡터 기능에 의존합니다.

주조 광선의 실제 기능은 화면 뷰포트가 Y 방향으로 -0.5에서 +0.5로 실행된다고 가정합니다. 이 기능은 매우 간단하며 '보기', 'UP'및 '오른쪽'벡터의 올바른 비율을 함께 추가하는 것으로 구성됩니다.

public class Camera {

    protected Point3d       eye;
    protected Point3d       center;

    protected Vector3d      up;
    protected Vector3d      right;
    protected Vector3d      view;

    protected double        fovy;           // half FoV in radians
    protected double        tanf;
    protected double        aspect;

    public Ray castRay(double x, double y) {

        Vector3d dir = new Vector3d(view);
        Vector3d t = new Vector3d();
        t.scale(tanf * x * aspect, right);
        dir.add(t);
        t.scale(tanf * y, up);

        dir.add(t);
        dir.normalize();

        return new Ray(eye, dir);
    }

    /* algorithm taken from gluLookAt */
    public void lookAt(Point3d _eye, Point3d _center, Vector3d _up) {

        eye = new Point3d(_eye);
        center = new Point3d(_center);
        Vector3d u = new Vector3d(_up);

        Vector3d f = new Vector3d(center);
        f.sub(eye);
        f.normalize();

        Vector3d s = new Vector3d();
        u.normalize();
        s.cross(f, u);
        s.normalize();
        u.cross(s, f);

        view = new Vector3d(f);
        right = new Vector3d(s);
        up = new Vector3d(u);
    }

    /* algorithm taken from gluPerspective */
    public void setfov(double _fovy, double _aspect)
    {
        fovy = Math.toRadians(_fovy) / 2.0;
        tanf = Math.tan(fovy);
        aspect = _aspect;
    }
}

다른 팁

정보 주셔서 감사합니다. 개인적으로, 나는 매트릭스 변환에 너무 편안하지 않으며 가능한 한 많이 피하고 싶습니다. 그러나 귀하의 게시물에서 나는 변환이 내가하고 싶은 일을하는 유일한 방법이라는 것을 이해합니까? 내가 꽤 가깝다고 생각했기 때문에 (화면의 정상과 중심점을 얻었습니다) 순수한 벡터 수학 솔루션을 좋아했을 것입니다.

나는 당신의 코드를 채택하려고 노력하지만 불행히도 나는 주로 Matrix4D 객체에서 어떤 시점에서 당신의 객체에서 내부적으로 무슨 일이 일어나고 있는지 정확히 알지 못합니다.

추신 : 질문의 제작자로서 stackoverflow에 대한 답변에 답장을 보내려면 해당 답변에 대해 의견을 제시해야합니까, 아니면 새로운 '답변'을 만들어도 괜찮습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top