작성
·
309
0
안녕하세요 선생님 선생님 강의를 따라하다가 애니메이션 부분을 일부러 안지우고 배열을 만들고 있었는데
아래와 같이 메쉬들 중 1개만 로테이션 되어 올라가는 현상이 있습니다. 관련하여 너무 궁금하여 질문 드립니다.
1 ) 왜 모든 메쉬가 회전하여 올라가지 않고 1개만 올라가는건가요?
2) for문에서 meshes 배열에 mesh객체들을 모두 push로 넣으면 모든 메쉬가 다 배열안으로 들어갔기 때문에
메쉬가 1개라도 회전하면 안되지 않나용?
<하나만 올라오는 메쉬 이미지>
코드는 아래처럼 사용했습니다..
const meshes = [];
let mesh;
for (let i = 0 ; i < 10; i++){
mesh = new THREE.Mesh(geometry, material);
mesh.position.x = Math.random() * 5
mesh.position.z = Math.random() * 5
scene.add(mesh);
meshes.push(mesh);
}
let oldTime = Date.now();
//그리기
function draw() {
const newTime = Date.now();
const deltaTime = newTime - oldTime;
oldTime = newTime;
mesh.rotation.y += deltaTime * 0.001;
mesh.position.y += 0.01;
renderer.render(scene, camera);
window.requestAnimationFrame(draw);
}
선생님 하나더 질문이 있습니다!
위에 for문 속의 THREE.Mesh()로 메쉬 실행시에 폴더경로 : three > build > three.js 의 아래부분이 실행되는건가요?
위 코드에서 만들어진 생성자 함수로 만든 mesh객체들이 배열안드로 들어간다고 보면 되는걸까요?
저는 push하게 되는순간 위에 랜덤값이 들어간 객체 자체가 배열로 들어간다고 생각했습니다.. 아래처럼요
너무 궁금합니다...
<제가 상상한 객체를 배열로 푸쉬하는 모습>
meshes = [
{position.x : 1.2 , position.y : 3.2 , ...............} //이런 모습보다 더 복잡하겠지만 '객체' 자체가 들어간다는것이 궁금합니다!
{position.x :1 , position.y :2 , ...............}
{position.x :4, position.y : 3.8 , ...............}
푸쉬 되는중....
]
궁금해서 찾아본 원래 클래스들인데..
class Mesh extends Object3D {
constructor(geometry = new BufferGeometry(), material = new MeshBasicMaterial()) {
super();
this.isMesh = true;
this.type = 'Mesh';
this.geometry = geometry;
this.material = material;
this.updateMorphTargets();
class Object3D extends EventDispatcher {
constructor() {
super();
this.isObject3D = true;
Object.defineProperty(this, 'id', {
value: _object3DId++
});
this.uuid = generateUUID();
this.name = '';
this.type = 'Object3D';
this.parent = null;
this.children = [];
this.up = Object3D.DefaultUp.clone();
const position = new Vector3();
const rotation = new Euler();
const quaternion = new Quaternion();
const scale = new Vector3(1, 1, 1);
- 질문에 대한 답변은 강의자가 하는 경우도 있고, 수강생 여러분들이 해주시는 경우도 있습니다. 같이 도와가며 공부해요! :)
- 작성하신 소스코드 자체의 오류보다는, 개념이나 원리가 이해되지 않는 부분을 질문해주시는게 좋습니다. 그대로 따라했는데 소스코드에서 버그가 나는 경우는 99%가 오타에 의한거라서, 완성된 소스랑 찬찬히 비교해보시면 직접 찾으실 수 있을 거예요. 개발자도구 console에 오류로 표시된 부분만 완성 코드에서 복사->붙여넣기를 해보시는 것도 방법입니다.
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
답변 1
0
for문 안에서 mesh 변수를 계속 사용하고 있는데요, 그러다보니 결과적으로는 최종적으로 생성한 메쉬가 mesh 변수에 들어가게 됩니다. 그래서 draw 함수 안에서 mesh.position을 조정하면 마지막으로 생성된 메쉬 하나만 움직이는 것이고요~ 메쉬를 여러개 생성해서 meshes 배열 안에 넣은 이유가 바로 draw 함수 내부에서 이 배열을 이용해서 모든 메쉬들을 컨트롤 하기 위함입니다. 아래처럼 forEach 메서드를 이용해서 meshes 배열의 모든 원소들(메쉬들)을 전부 움직여줘야겠지요~ 강의에서 진행하는 예제들에서 보시면 그런 식으로 되어있답니다.
meshes.forEach(item => {
item.position.y += 0.01;
})
자바스크립트에서 객체(Object)를 저장하는 방식은, 객체 자체는 메모리에 저장하고 변수는 그 객체가 메모리에 저장된 주소를 가리키게 되어있습니다. 새로 생성해서 배열에 push할 때마다 랜덤한 위치값을 지정해주면 각 메쉬들이 각자의 랜덤값을 갖고있는 것은 맞는데, 보통은 draw 함수에서 바로 값을 갱신하기 때문에 바로 값이 변하게 되는거지요.
아! 읽어보니 아직 객체 기초가 부족한것 같습니다 ㅠ_ㅠ 알려주셔서 감사합니다.