<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691737</guid>
        <pubDate>Thu, 03 Nov 2016 20:04:33 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691737</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409868&view=findpost&p=3691735'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>egvos1 &#064; <time class="tag-quote__quoted-time" datetime="2016-11-03T22:57:24+03:00">03.11.16, 19:57</time></span><div class='quote '>А почему для поворота модели нужно брать обратную матрицу?</div></div><br>
Потому, что трансформации камеры или мира - ровно противоположные вещи. Если модель движется вдоль вектора V, то это то же самое, что камера движется по направлению -V, то же самое работает и на вращения и прочие преобразования. Приведённая мной матрица заставляет камеру занимать указанную позицию, значит противоположная матрица будет заставлять занимать такую же позицию модель.]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691735</guid>
        <pubDate>Thu, 03 Nov 2016 19:57:24 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691735</link>
        <description><![CDATA[egvos1: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Зачем нужна эта модель, если она всё равно позади камеры, её не видно?</div></div><br>
<br>
Видно руки 3д человечка, выставленные вперед, в них будет оружие которое тоже будет видно снизу сбоку. Стандартный вид от первого лица как в любом зд шутере<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>то достаточно просто взять матрицу, обратную этой, и применить её к модели</div></div><br>
<br>
А почему для поворота модели нужно брать обратную матрицу?]]></description>
        <author>egvos1</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691691</guid>
        <pubDate>Thu, 03 Nov 2016 17:33:49 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691691</link>
        <description><![CDATA[Mikle: Я ни Джаву, ни LibGDX не знаю, там у камеры нет методов, типа GetMatrix?<br>
Вообще, эта матрица и вручную не сложно вычисляется:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Sub MatrixLookAtLH(MOut As D3DMATRIX, vEye As D3DVECTOR, vAt As D3DVECTOR, vUp As D3DVECTOR)</div><div class="code_line">&nbsp;&nbsp;Dim xAxis As D3DVECTOR, yAxis As D3DVECTOR, zAxis As D3DVECTOR, v As D3DVECTOR</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Vec3Subtract v, vAt, vEye</div><div class="code_line">&nbsp;&nbsp;Vec3Normalize zAxis, v</div><div class="code_line">&nbsp;&nbsp;Vec3Cross v, vUp, zAxis</div><div class="code_line">&nbsp;&nbsp;Vec3Normalize xAxis, v</div><div class="code_line">&nbsp;&nbsp;Vec3Cross yAxis, zAxis, xAxis</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MOut.m11 = xAxis.x</div><div class="code_line">&nbsp;&nbsp;MOut.m12 = yAxis.x</div><div class="code_line">&nbsp;&nbsp;MOut.m13 = zAxis.x</div><div class="code_line">&nbsp;&nbsp;MOut.m14 = 0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MOut.m21 = xAxis.y</div><div class="code_line">&nbsp;&nbsp;MOut.m22 = yAxis.y</div><div class="code_line">&nbsp;&nbsp;MOut.m23 = zAxis.y</div><div class="code_line">&nbsp;&nbsp;MOut.m24 = 0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MOut.m31 = xAxis.z</div><div class="code_line">&nbsp;&nbsp;MOut.m32 = yAxis.z</div><div class="code_line">&nbsp;&nbsp;MOut.m33 = zAxis.z</div><div class="code_line">&nbsp;&nbsp;MOut.m34 = 0</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MOut.m41 = -Vec3Dot(xAxis, vEye)</div><div class="code_line">&nbsp;&nbsp;MOut.m42 = -Vec3Dot(yAxis, vEye)</div><div class="code_line">&nbsp;&nbsp;MOut.m43 = -Vec3Dot(zAxis, vEye)</div><div class="code_line">&nbsp;&nbsp;MOut.m44 = 1</div><div class="code_line">End Sub</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Это бейсик, но, думаю, понятно.]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691688</guid>
        <pubDate>Thu, 03 Nov 2016 17:26:45 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691688</link>
        <description><![CDATA[egvos1: Сорри, я только начинаю разбираться с OpenGL и 3д.<br>Как я могу получить матрицу LookAt? Как применить ее к модели?]]></description>
        <author>egvos1</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691683</guid>
        <pubDate>Thu, 03 Nov 2016 16:25:02 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691683</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409868&view=findpost&p=3691669'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>egvos1 &#064; <time class="tag-quote__quoted-time" datetime="2016-11-03T14:09:48+00:00">03.11.16, 14:09</time></span><div class='quote '>Модель игрока располагается чуть позади камеры и должна перемещаться, летает в космосе вместе с ней.</div></div><br>
Зачем нужна эта модель, если она всё равно позади камеры, её не видно?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409868&view=findpost&p=3691669'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>egvos1 &#064; <time class="tag-quote__quoted-time" datetime="2016-11-03T14:09:48+00:00">03.11.16, 14:09</time></span><div class='quote '>Т.е. как используя кватернионы, повернуть 3д модель так чтобы она лицевой стороной смотрела туда куда смотрит камера LookAt.</div></div><br>
Кватернионы, может быть, был бы смысл использовать, если бы писать с нуля, но, если уже есть камера и её матрица, вычисленная с помощью LookAt, то достаточно просто взять матрицу, обратную этой, и применить её к модели, плюс сдвинуть её на сколько надо вдоль оси Z.]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691669</guid>
        <pubDate>Thu, 03 Nov 2016 14:09:48 +0000</pubDate>
        <title>Как повернуть 3д модель, используя кватернионы</title>
        <link>https://forum.sources.ru/index.php?showtopic=409868&amp;view=findpost&amp;p=3691669</link>
        <description><![CDATA[egvos1: Всем привет, нужна помощь.<br>
<br>
Хочу реализовать в своей 3д игрушке вид от первого лица. Уже реализовал свободное перемещение камеры в 3д мире, допустим в космосе.<br>
Создал пробную 3д модель игрока (человечка) в Blender. Загружаю его в свою программу и располагаю чуть позади камеры LookAt, так чтобы камеры смотрела от лица человечка вперед.<br>
Все координаты камеры мне известны:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">cam.position.set ((float)x1, (float)y1, (float)z1); // Точка откуда смотрит камера</div><div class="code_line">cam.lookAt ((float)x2, (float)y2, (float)z2); // Точка куда смотрит камера</div><div class="code_line">cam.up.set((float)rx, (float)ry, (float)rz); // up вектор</div><div class="code_line">cam.update();</div></ol></div></div></div></div><br>
Камера в игре свободно перемещается и вращается вокруг осей.<br>
Координаты 3д модели допустим, камера смотрит из лица вперед:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">insPlayer.transform.setToTranslation((float)x1, (float)y1-4, (float)z1);</div></ol></div></div></div></div><br>
Модель игрока располагается чуть позади камеры и должна перемещаться, летает в космосе вместе с ней. Вопрос в том, как сделать свободное вращение этой модели так же вокруг своих осей, зная указанные исходные данные.<br>
Т.е. например я поворачиваю камеру вверх на 60 градусов и соответственно 3д модель также должна повернуться вверх. Также должно быть и вращение вокруг оси куда смотрит камера и другие вращения.<br>
Поиск в интернете дал единственный вариант: использовать кватернионы. Т.е. как используя кватернионы, повернуть 3д модель так чтобы она лицевой стороной смотрела туда куда смотрит камера LookAt.<br>
Вот такой код у меня не работает правильно:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">insPlayer.transform.setToTranslation((float)x1, (float)y1-4, (float)z1+20); // Размещаем модель чуть позади камеры LookAt</div><div class="code_line">Vector3 pl_z = new Vector3 ((float)x2, (float)y2, (float)z2).nor(); // Нормализованный вектор куда смотрит камера</div><div class="code_line">Vector3 pl_y = new Vector3 ((float)rx, (float)ry, (float)rz).nor(); // Нормализованный up вектор камеры</div><div class="code_line">Vector3 pl_x = pl_z.crs(pl_y).nor(); // Нормализованный кросс продукт (вектор перпендикулярный двум предыдущим)</div><div class="code_line">Quaternion qy = new Quaternion(pl_y, y_ang); // Создаем кватернион вращения вокруг вертикальной оси, y_ang - угол вращения вокруг вектора pl_y</div><div class="code_line">Quaternion qz = new Quaternion(pl_z, z_ang); // Создаем кватернион вращения вокруг оси направления взгляда камеры, z_ang - угол вращения вокруг вектора pl_z</div><div class="code_line">Quaternion qx = new Quaternion(pl_x, x_ang); // Создаем кватернион вращения вокруг кросс продукта</div><div class="code_line">qy = qy.mul(qz); // Перемножаем кватернионы</div><div class="code_line">qy = qy.mul(qx);</div><div class="code_line">insPlayer.transform.translate (0, 4, 0);</div><div class="code_line">insPlayer.transform.rotate(qy); // Поворачиваем модель по кватерниону</div><div class="code_line">insPlayer.transform.translate (0, -4, 0);</div><div class="code_line">modelBatch.render(insPlayer); // Рисуем модель</div></ol></div></div></div></div><br>
<br>
Может кто чем помочь? Какие есть мысли?<br>
Спасибо.]]></description>
        <author>egvos1</author>
        <category>Программирование графики</category>
      </item>
	
      </channel>
      </rss>
	