레이 마칭에서 three.js의 PerspectiveCamera 사용
THREE.OrbitControls 등으로 카메라를 제어할 수 있으면 편리할 것이라고 생각해 조사했습니다.먼저 결과를 보여주면 이런 느낌입니다. 위가
THEEE.OrbitControls 로 제어한 THREE.PerspectiveCamera 로 보통으로 렌더링한 것으로, 아래가 같은 카메라의 정보를 바탕으로 레이마칭으로 렌더링한 것입니다. 색상 이외는 같은 방식으로 표시됩니다.
아래에서 실제로 움직이는 것을 확인할 수 있습니다.
htps : // 오로 b에서 b. 기주 b. 이오/s개 dy-th 네. js / 라 y 마 r 찐 g-우 th th three js - 카메라. HTML
구체적으로 무엇을 하고 있는가 하면, three.js 의
PerspectiveCameara 의 정보를 레이마칭을 실시하는 쉐이더에 uniform로 건네주어, 그 정보를 기초로 레이를 생성하고 있습니다.레이마칭을 하는 쉐이더측은 이와 같이 되어 있습니다.
perspectiveCamera 함수의 설계에 대해서는 이 기사 도 참고해 주세요.raymarch 코드(발췌)
uniform vec2 resolution;
uniform vec3 cameraPosition;
uniform vec3 cameraDirection;
uniform float cameraAspect;
uniform float cameraFov;
void perspectiveCamera(in vec2 uv, in vec3 position, in vec3 cameraDirection, in float fov, in float aspect, out vec3 origin, out vec3 dir) {
  vec2 st = uv * 2.0 - 1.0;
  float radian = fov * PI / 180.0;
  float h = tan(radian * 0.5);
  float w = h * aspect;
  vec3 right = normalize(cross(cameraDirection, vec3(0.0, 1.0, 0.0)));
  vec3 up = normalize(cross(right, cameraDirection));
  dir = normalize(right * w * st.x + up * h * st.y + cameraDirection);
  origin = position;
}
void main() {
  vec3 rayOrigin, rayDirection;
  perspectiveCamera(gl_FragCoord.xy / resolution, cameraPosition, cameraDirection, cameraFov, cameraAspect, rayOrigin, rayDirection);
  vec3 color = raymarch(rayOrigin, rayDirection);
  gl_FragColor = vec4(color, 1.0);
}
JavaScript 측에서
THREE.PerspectiveCamera 의 정보를 셰이더 측에 건네주는 부분은 이와 같이 되어 있습니다. 이 코드에서는 THREE.RawShaderMaterial의 unifoms 매개 변수로 unifom을 전달한다고 가정합니다.THREE.PerspectiveCamera 의 #getWorldDirection 와 #getWorldPosition 로 월드 좌표계에서의 카메라의 방향과 위치를 각각 인수에 건네준 변수에 넣어 줍니다. 이 메소드를 렌더링 그룹의 OrbitControls#update (을)를 실행한 후에 등으로 부르는 것으로 레이마칭의 쉐이더측에서도 현재의 카메라의 정보를 이용할 수 있게 됩니다.const raymarchUniforms = {
  resolution: {value: new THREE.Vector2(window.innerWidth, window.innerHeight / 2.0)},
  cameraPosition: {value: new THREE.Vector3()},
  cameraDirection: {value: new THREE.Vector3()},
  cameraAspect: {value: camera.aspect},
  cameraFov: {value: camera.fov},
};
// called in rendering loop
camera.getWorldDirection(raymarchUniforms.cameraDirection.value);
camera.getWorldPosition(raymarchUniforms.cameraPosition.value);
                Reference
이 문제에 관하여(레이 마칭에서 three.js의 PerspectiveCamera 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aa_debdeb/items/384b2cebbc16926d8d6c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)