아래 코드들은 이전의 라이브 예제와 이어집니다.
<canvas id="c"></canvas>
<style>
html, body {
margin: 0;
height: 100%;
}
#c {
width: 100%;
height: 100%;
display: block;
}
</style>
이런!
화면 높이를 변경하니 콘텐츠도 같이 세로로 늘어나고 확대하면 콘텐츠가 깨진다!!ㅜ카메라
를 이용해서 해결할 수 있다.aspect(비율)
을 canvas 크기에 맞춰야한다.(창이 세로로 커지면 카메라 비율도 같이 변경!)function render(time) {
time *= 0.001;
const canvas = renderer.domElement; //canvas 불러오기
camera.aspect = canvas.clientWidth / canvas.clientHeight; //canvas비율을 카메라에 적용
camera.updateProjectionMatrix(); //변경된 값을 카메라에 적용
}
아니!
콘텐츠 크기가 일정한 비율로 커지는데, 콘텐츠를 확대하면 깨진다ㅜ!!드로잉버퍼(drawingbuffer/해상도)의 크기
를 canvas의 디스플레이 크기
로 지정하여 해결가능하다.아니, 귀찮게 크기를 비교하지 말고 계속 드로잉 버퍼의 크기를 변경하면 안되나요?
안됩니다! canvas의 크기를 변경할 때마다 화면을 다시 랜더링하므로, 계속 변경하게 하면 자원 낭비가 심합니다.ㅜ
// a. resize 함수 생성
function resizeRendererToDisplaySize(renderer) {
const canvas = renderer.domElement;
const width = canvas.clientWidth;
const height = canvas.clientHeight;
const needResize = canvas.width !== width || canvas.hegiht !== height;
if (neddResize) {
renderer.setSize(width, height, false); //canvas 리사이징(마지막인자는 꼭 false!)
}
return needResize;
}
// b. resize가 true이면 -> 카메라 비율을 변경함
function render(time) {
time *= 0.001;
if (resizeRendererToDisplaySize(renderer)) {
const canvas = renderer.domElement;
camera.aspect = canvas.clientWidth / canvas.clientHeight;
camera.updateProjectionMatrix();
}
}