동차좌표계를 시각화 해봤다

컴퓨터 그래픽스 공부하다가 동차좌표계가 이해가 되지 않아서 한참동안 헤맸다. 그러다가 드디어 이해했다. 내가 이해한 것이 맞는지 검증하고 싶어서 시각화 해보고 싶었다. 그리고 나처럼 이해하기 힘들었던 사람들에게 도움이 될까 해서 시각화를 제대로 해서 공유하고자 했다.

ChatGPT 한테 시켜서 MATLAB 시각화 프로그램을 만들었다:

나:

컴퓨터 그래픽스 시스템들 (예를 들면 OpenGL과 Direct X) 에서는 흔히 3차원 공간 좌표가 아니라 4차원 공간좌표를 이용하잖아. 이른바 “동차좌표계”라고.
3차원 공간 좌표를 4차원 동차좌표로 전환하는 방법은 아래와 같아:
점의 3차원 공간 좌표가 (x, y, z) 라고 했을 때, 이 점의 4차원 동차좌표계 좌표는: (x/w, y/w, z/w, w) 이다. (이중 w != 0)
이러한 동차좌표계를 시각화 하고자 해. 하지만 4차원은 시각화할 수 없잖아. 그래서 그 원리 설명에 도움만 될 수 있도록 2차원 평면 좌표계를 3차원 동차 좌표계로 전환시키고자 해.
2차원 평면 직교좌표계의 좌표가 (x, y) 라고 했을 때, 이 점의 3차원 동차좌표는 당연히 (x/w, y/w, w) (이중 w != 0) 이 되겠지.
2차원 평면상에 정사각형 A가 있다고 가정하자. 이 정사각형 정점들의 2차원 직교 좌표는 각각 (1, 1), (-1, 1), (-1, -1), (1, -1) 이라고 하자. 이 정점들의 동차좌표는 각각 아래와 같겠지:
(1/w, 1/w, w),
(-1/w, 1/w, w),
(-1/w, 1/w, w),
(1/w, -1/w, w). (이중 w != 0)
아래 몇가지 일을 하는 MATLAB 프로그램을 하나 짜줘:
w가 0.1 에서 7까지, 0.1 단위로 linspace 를 가질 때, 동차 좌표 (x, y, w)를 surf 기능으로 입체적으로 그려줘.

ChatGPT가 만들어준 프로그램: (물론 실제 조련과정은 훨씬 복잡했다.)

function plot_homogeneous_coordinates()
    % Define the w values
    w_values = linspace(0.1, 7, 50);
    figure;
    hold on;

    % Define the vertices of the square
    vertices = [1, -1, -1, 1, 1; 1, 1, -1, -1, 1];

    % Create a 3D matrix to hold the x, y, w coordinates for each w
    x_values = zeros(5, length(w_values));
    y_values = zeros(5, length(w_values));
    w_coordinates = zeros(5, length(w_values));

    % Compute the homogeneous coordinates for each value of w
    for i = 1:length(w_values)
        w = w_values(i);
        homogeneous_vertices = [vertices(1,:)/w; vertices(2,:)/w; repmat(w,1,5)];
        
        x_values(:, i) = homogeneous_vertices(1, :);
        y_values(:, i) = homogeneous_vertices(2, :);
        w_coordinates(:, i) = homogeneous_vertices(3, :);
    end

    % Create the 3D mesh plot
    surf(x_values, y_values, w_coordinates);
    grid;

    % Plot the axes
    plot3([-1.5, 1.5], [0, 0], [0, 0], 'k') % x-axis
    plot3([0, 0], [-1.5, 1.5], [0, 0], 'k') % y-axis
    plot3([0, 0], [0, 0], [-1.5, 1.5], 'k') % w-axis

    % Label the axes
    xlabel('x');
    ylabel('y');
    zlabel('w');

    % Set the view
    view(3);
    
    % Setting the aspect ratio to be equal for all axis
    axis equal;
end

Plot 결과: