• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

Frustum 질문입니다

23.01.02 13:39 작성 23.01.02 13:42 수정 조회수 192

0

- 질문에 대한 답변은 강의자가 하는 경우도 있고, 수강생 여러분들이 해주시는 경우도 있습니다. 같이 도와가며 공부해요! :)
- 작성하신 소스코드 자체의 오류보다는, 개념이나 원리가 이해되지 않는 부분을 질문해주시는게 좋습니다. 그대로 따라했는데 소스코드에서 버그가 나는 경우는 99%가 오타에 의한거라서, 완성된 소스랑 찬찬히 비교해보시면 직접 찾으실 수 있을 거예요. 개발자도구 console에 오류로 표시된 부분만 완성 코드에서 복사->붙여넣기를 해보시는 것도 방법입니다.
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요.

이전 글에서 알려주신대로 frustum 사용해서 오브젝트가 벽에 부딪히는 듯한 인터랙션을 만들긴 했는데

이게 mesh의 포지션을 사용하다보니 오브젝트가 돌아가있는 경우에는 정확하게 벽에 부딪히지 않습니다.

mesh의 특정 포지션보다는 mesh가 차지하는 영역과 frustum이 만나는 때에 인터랙션이 적용되게 하면 더 좋을 거 같은데

혹시 떠오르는 방법이 있으신가요?

frustum.intersectsObject(mesh)

를 사용해봤는데 블렌더에서 가져온 mesh라 그런지 다음과 같은 에러가 발생합니다.

Uncaught TypeError: Cannot read properties of undefined (reading 'boundingSphere')

at Frustum.intersectsObject (three.module.js:12455:1)

at updatePhysics (interactions.js:153:1)

at draw (interactions.js:264:1)

at onAnimationFrame (three.module.js:27781:1)

at onAnimationFrame

좋은 강의 외에도 도움 많이 받고 있습니다. 사이드 프로젝트가 완성되면 코드 공유하도록 하겠습니다. 감사합니다!

답변 1

답변을 작성해보세요.

0

혹시 튕겨지는 벽면을 cannon body로 세우신 건가요? cannon으로 벽을 세웠고, draw할 때마다 각 오브젝트들의 quaternion을 메쉬에 적용시켜주었다면 회전이 되더라도 제대로 튕길 것 같아서요~
아니면 여러가지 이유들로 좌표값을 이용해서 해당 좌표에 다다랐을 때 직접 처리를 하신거라면, 실제 메쉬 형태가 무엇이든 cannon 오브젝트는 CANNON.Sphere로 하시면 어떨까 싶습니다. 보통 충돌처리할 때 복잡하게 생긴 것들은 그냥 원 형태의 충돌로 판정하면 간편하더라고요.

혹시 더 좋은 생각이나 방법이 떠오르면 다시 댓글 남기도록 하겠습니다.
작업하신 걸 보니 인터랙티브 웹 작업 많이 해보신 분 같아요^^ 멋진 프로젝트 화이팅하시길 바라겠습니다!

hyshim5님의 프로필

hyshim5

질문자

2023.01.02

제가 구현한 방식은 cannon body로 벽면을 따로 세워두진 않았습니다.

제가 구현한 방식은 다음과 같습니다.

  1. frustum.containsPoint(mesh.position)이 false이면 카메라 바깥으로 나간 것으로 판별

  2. 카메라 바깥으로 나간 면이 가로면인지 세로면인지 판별

  3. 부딪힌 면과 수직인 cannon.body.velocity(x 또는 y)를 반대로 뒤집어줌

위와 같이 하면 벽에 튕기는 것과 같은 효과를 낼 수 있습니다.

문제는 mesh.position이 정확하지 않다는 것인데 mesh의 아웃라인에 해당하는 포지션들을 여러개 가져올 수는 없을까요?

그럼 해당 포지션에 대해서 frustum.containsPoint(mesh.position)를 계산해보면 더 정확하게 벽에 부딪히는 이펙트를 낼 수 있을 거 같습니다.

제가 3D는 완전 처음이라 강사님이 생각나시는 방법이 있으면 알려주시면 감사하겠습니다.

이 사이트가 제가 레퍼런스로 삼은 사이트입니다.

레퍼런스 사이트를 보니 카메라는 OrthographicCamera를 사용했고, 카메라가 중앙 상단에 고정되어 있네요~ 이런 경우에는 frustum을 사용할 필요 없이, 그냥 알맞는 위치에 cannon body로 보이지 않는 벽(mass: 0으로 고정)을 세우시는게 가장 간단할 것 같아요. 그러면 각 물체의 크기가 달라도, 벽에 부딪히거나 물체끼리 서로 부딪혔을 때 자연스럽게 처리가 될테니까, 온전히 물리엔진의 기능을 활용하는 방법이 되겠지요!

hyshim5님의 프로필

hyshim5

질문자

2023.01.07

아 제가 카메라를 잘못 이해해서 이런 문제가 생겼네요ㅜㅜ알려주셔서 정말 감사합니다!

사이드 프로젝트는 완성하면 공유하겠습니다