opengl 마우스로 물체 이동 질문드립니다.

iop9709의 이미지

opengl es를 사용하여 마우스로 물체를 클릭한 상태에서 커서가 이동한 위치로 물체를 옮기는 코드를 작성중입니다. 마우스로 물체를 선택하는 것까지 완료했는데 커서 위치까지 움직인 거리를 어떻게 계산해야 좋을지 감이 안오네요. gl함수를 사용하는 것이 아닌, 수학적 개념을 이용해서 각 공간의 역변환을 구현한 상황입니다. 물체 이동거리를 어떻게 계산하면 좋을까요??

ifree의 이미지

물체의 이동 거리가 아닌, 물체의 공간 좌표와 스크린 좌표를 매핑하여 다시 그려 주면 됩니다.
공간에서 물체를 그리는 기준점과 스크린 좌표 사이의 매핑이 있을 테니, 여기에 마우스를 클릭한 점과 움직인 점을 감안하여 새로 그리는 기준점을 정하면 되겠죠.
2D, 또는 3D의 경우에도 orthogonal view 인 경우에는 쉽게 계산이 되는데,
perspective view 의 경우에는 상당히 복잡한 연산을 거쳐야 합니다.

iop9709의 이미지

제가 아직 초보자라.. 답변이 잘 이해가 가지 않아서 그러는데 처음 마우스로 클릭했을때의 Object space상의 좌표를 알고 있고, 이제 screen space에서 마우스 커서를 움직이면서 물체를 커서에 맞게 움직이려고 합니다.
현재 제 생각은 움직이는 마우스 커서의 Object space 좌표를 구해서 두 값의 차이를 world transform에 translate연산을 하였는데 생각대로 안움직이네요..

ifree의 이미지

2D 인가요?

iop9709의 이미지

3D물체입니다!

iop9709의 이미지

클릭한 좌표의 Object space 혹은 world space 상의 위치를 가지고 z값은 일정하게 x,y만 마우스 커서방향으로 이동하려고 하는데 잘안되네요..

iop9709의 이미지

물체의 클릭여부는 bounding volume을 이용하여 ray로 충돌테스트를 하였습니다.

ifree의 이미지

회전된 뷰에서 보면, z 값을 일정하게 유지해도 물체가 앞, 뒤로 이동하게 되죠.

ifree의 이미지

3D 의 경우에는 2차원 화면 공간과 3차원 물체 공간이 일대일 대응이 되지 않습니다.
물체를 3D의 orthogonal view 로 물체 공간의 xy 평면 상에서 보는 경우,
(4, 5, 0) 인 점이나 (4, 5, 10) 인 점이나 스크린 상에서는 동일한 위치에 표시됩니다.
그래도, 이 경우에는 z 좌표를 일정하게 놓고 매핑을 하면 됩니다.

문제는 xy 평면이나 yz 평면이 아닌, 일반적으로 회전된 뷰에서 보는 경우인데,
이 경우에는 스크린 좌표에서는 이차원 평면 이동이지만, 물체 공간에서는 세 개의 좌표가 모두 변하는 공간 이동이 됩니다. 따라서, 상당히 복잡한 수학적 연산을 필요로 하죠. 스크린 상에서 동일한 깊이가 되도록 공간 변환을 해주어야 합니다.

iop9709의 이미지

현재 제가 구현한 함수로 마우스가 클릭된 스크린 좌표(x,y)의 world space, object space 공간에서 ray의 시작점과 방향벡터를 알고 마우스를 클릭했을 시 물체가 충돌한 좌표를 알고 있습니다.
여기서 마우스가 움직이면서 좌표 (x', y')의 ray의 시작점, 방향벡터만을 알고 있는데 이것들만으로 평행이동을 어떻게 구현할 수 있을까요?? 어떤 값을 구해서 world space에 translate 변환을 적용하면 될 것 같은데.. 조언부탁드립니다.

ifree의 이미지

제가 이전에 작성했던 문서를 올립니다.
아마 알아 보기 힘드시겠지만, 무지 복잡할 것입니다.
요지는 스크린에서 일정 깊이를 유지하며 새로운 좌표를 구하는 것입니다.
도움이 되지 않는 것 같아서 죄송합니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon perspective_pnt_01.jpg493.63 KB
Image icon perspective_pnt_02.jpg434.89 KB
iop9709의 이미지

아닙니다. 친절한 답변 매우 감사드립니다!

iop9709의 이미지

감사합니다! 질문을 너무 많이해서 죄송한데.. 마지막으로 위에서 제가 언급한 ray의 정보들만을 가지고 world transform에 변화를 줄 수 있는 방법이 없을까요??

ifree의 이미지

한 레이의 방향과 스크린의 점으로부터의 거리를 알고 있다면, 새로운 레이에 대해서는 스크린을 기준점으로 해서 이로부터 새로운 레이의 방향과 이전 충돌 레이의 거리를 가지는 새로운 좌표를 정할 수 있지 않을까요?

익명 사용자의 이미지

혹시 그림을 그려봤는데.. 이걸 토대로 구할 수 있는 방법이 있을까요??

댓글 첨부 파일: 
첨부파일 크기
Image icon 20200617_155055.jpg1.94 MB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.