Scene와 Camera 객체를 넘겨받아서 랜더링 한다.
배경색 안개등의 요소를 포함하게되며, 최상위 노드에 해당한다.
Material로 하나의 Geometry를 그리는 객체이다.
Material, Geometry 둘다 재사용이 가능하다.
기하학 객체의 정점 데이터이다.
객체를 그리는데 사용하면 표면속성이다.
하나의 material은 여러개의 texture를 사용할수있다.
const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
const material = new THREE.MeshBasicMaterial({color: 0x44aa88}); // greenish blue
const cube = new THREE.Mesh(geometry, material); //mesh로 geometry, material을 하나로 묶어줌
scene.add(cube); //scene에 추가
이미지나 파일에서 로드한 이미지, canvas로 생성한 이미지,
다른 Scene 객체에서 렌더링한 결과물에 해당.
창 크기를 조절할때에 객체의 모양이 변하는것을 방지하기위하여
아래와 같은 방법을 사용한다.
const canvas = render.domElement;
//aspect(비율 속성)
camera.aspect = canvas.clientWidth / canvas.clientHeight;
camera.updateProejctionMatrix();
function resizeRendererToDisplaySize(renderer){
const canvas = renderer.domElement;
const pixelRatio = window.devicePixelRatio;
const width = canvas.clientWidth * pixelRatio | 0;
const height = canvas.clientHeight * pixelRatio | 0;
const needResize = canvas.width !== width || canvas.height !== height;
if(needResize){
renderer.setSize(width, height, false);
}
return needResize;
}
function render(time){
time *= 0.001;
if(resizeRendererToDisplaySize(renderer)){
const canvas = renderer.domElement;
camera.aspect = canvas.clientWidth / canvas.clientHeight;
camera.updateProjectionMatrix();
}
...
}
Object3D는 Mesh와 마찬가지로 Scene Graph의 한 요소이지만,
material과 geometry가 없다는것이 다른점이다.
Object3D로 지역공간을 만들어서 Scene Graph 아래에 추가시켜줄수있다.
const solarSystem = new THREE.Object3D();
const m4 = new THREE.MeshBasicMaterial({color: 'rgb(255,0,0)'});
material.color.set(rgb(255,127,64))
Material에 따라 광원의 영향을 받지 않는것들도 있다.
일반적으로 포토샵같은 프로그램으로 만든 이미지를 의미한다.
const loader = new THREE.TextureLoader();
const material = new THREE.MeshBasicMaterial({
//텍스처 불러오기
map : loader.load('./wall.jpg'),
})
loader.load 메소드는 비동기로 작동하게된다.
const loader = new THREE.TextureLoader();
loader.load('resources/images/wall.jpg', (texture) => {
const material = new THREE.MeshBasicMaterial({
map: texture,
});
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
cubes.push(cube);
})
다수의 텍스처를 한번에 불러와야 할 경우에는 LoadingManager를 사용할수있다.
const loadManager = new THREE.LoadingManager();
const loader = new THREE.TextureLoader(loadManager);
//...
loadManager.onLoad = () => {
const cube = new THREE.Mesh(geometry, materials);
scene.add(cube);
cubes.push(cube);
}
Three.js 기본적으로 텍스처를 반복하지 않는다.
반복여부를 설정하는 2가지 속성중 수평 래핑 wrapS, 수직 래핑 wrpaT가 있다.
texture의 각각 repeat, offset, center, rotation을 사용하여서 각 값을 바꿀순있다.
즉 정육면체에 만약 texture를 적용한다면 정육면체 각 면에 나타나는 화면을 조금씩 바꿀수있다는것.