<?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=410532&amp;view=findpost&amp;p=3715809</guid>
        <pubDate>Fri, 07 Apr 2017 06:04:37 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3715809</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3715796'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2017-04-07T00:56:56+00:00">07.04.17, 00:56</time></span><div class='quote '>Лично я даже не знаю, куда там должны быть правильные нормали направлены (если те, что для расчёта освещения).</div></div><br>
Тут, в общем, понятно. Любая нормаль подразумевает плоскость, к которой она и является нормалью. Ищем эту плоскость, трансформируем её нашей матрицей (в данном случае не аффинной), а к полученной плоскости снова ищем нормаль - это и есть искомая величина. Мой метод так и сделан, и я уже догадываюсь, почему он не работает, попробую исправить. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-04-07T09:36:17+03:00">07.04.17, 06:36</time></span></span><br>
Готово&#33;<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">Public Sub TransformPosNorm(Pos As D3DVECTOR, Norm As D3DVECTOR, M As D3DMATRIX)</div><div class="code_line">&nbsp;&nbsp;Dim V1 As D3DVECTOR</div><div class="code_line">&nbsp;&nbsp;Dim V2 As D3DVECTOR</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;If Abs(Norm.x) &#60; Abs(Norm.y) Then</div><div class="code_line">&nbsp;&nbsp; &nbsp;V1 = Vec3(1, 0, 0)</div><div class="code_line">&nbsp;&nbsp;Else</div><div class="code_line">&nbsp;&nbsp; &nbsp;V1 = Vec3(0, 1, 0)</div><div class="code_line">&nbsp;&nbsp;End If</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross V1, V1, Norm</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross V2, V1, Norm</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Add V1, V1, Pos</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Add V2, V2, Pos</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord Pos, Pos, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord V1, V1, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord V2, V2, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Subtract V1, V1, Pos</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Subtract V2, V2, Pos</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross Norm, V2, V1</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Normalize Norm, Norm</div><div class="code_line">End Sub</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3715796</guid>
        <pubDate>Fri, 07 Apr 2017 00:56:56 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3715796</link>
        <description><![CDATA[amk: С перспективными искажениями всё очень плохо. Лично я даже не знаю, куда там должны быть правильные нормали направлены (если те, что для расчёта освещения).]]></description>
        <author>amk</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3715761</guid>
        <pubDate>Thu, 06 Apr 2017 17:17:38 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3715761</link>
        <description><![CDATA[Mikle: Хм.. а как быть, если матрица содержит и перспективные искажения? <br>И преобразования транспонированной инверсной матрицей, и мой вариант дают одинаковый неверный результат.]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712282</guid>
        <pubDate>Tue, 21 Mar 2017 06:11:43 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712282</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3712246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T23:28:22+00:00">20.03.17, 23:28</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=410532&view=findpost&p=3712246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T23:28:22+00:00">20.03.17, 23:28</time></span><div class='quote '>Похоже не так просто подсказку найти оказалось (4 часа прошло)</div></div><br>
Я не привык долго искать. То, что нашёл по первым трём ссылкам, касалось преобразования параметров источника света вместо нормалей модели, это всё правильно, но этим я пользовался и раньше, а сейчас не тот случай.<br>
Поэтому я по привычке сел и написал свой велосипед, и он таки оказался правильным, но не оптимальным.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3712246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>amk &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T23:28:22+00:00">20.03.17, 23:28</time></span><div class='quote '>Так что на всякий случай проверь, всегда ли правильная нормаль получается.</div></div><br>
В моём первом решении - всегда. В последнем результаты для всех видов трансформаций не проверял, но это общепринятый метод, который я в своё время просто умудрился пропустить.]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712262</guid>
        <pubDate>Tue, 21 Mar 2017 02:13:50 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712262</link>
        <description><![CDATA[MBo: &gt;Что-то не то. Вектор получается не нормальный к поверхности.<br>Это вектор, перпендикулярный данному]]></description>
        <author>MBo</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712246</guid>
        <pubDate>Mon, 20 Mar 2017 23:28:22 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712246</link>
        <description><![CDATA[amk: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3712036'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T08:07:29+00:00">20.03.17, 08:07</time></span><div class='quote '>Есть такой подход для генерации перпендикулярного вектора в 3D:</div></div> Что-то не то. Вектор получается не нормальный к поверхности.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3712125'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Mikle &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T12:00:09+00:00">20.03.17, 12:00</time></span><div class='quote '>Всего-то нужно было сделать так:</div></div> Похоже не так просто подсказку найти оказалось (4 часа прошло) Вообще-то матрица преобразования нормалей получается умножением почти тех же матриц, как и матрица преобразования координат, но выбрасываются сдвиги, и вместо масштабных используются их обратные (что насчёт перспективного преобразования, не помню).<br>
Так что на всякий случай проверь, всегда ли правильная нормаль получается.]]></description>
        <author>amk</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712125</guid>
        <pubDate>Mon, 20 Mar 2017 12:00:09 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712125</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Нормали трансформируют транспонированной инверсной матрицей.</div></div><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">Public Sub Transform(Norm As D3DVECTOR, M As D3DMATRIX)</div><div class="code_line">&nbsp;&nbsp;Dim M1 As D3DMATRIX</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;D3DXMatrixInverse M1, M</div><div class="code_line">&nbsp;&nbsp;D3DXMatrixTranspose M1, M1</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformNormal Norm, Norm, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Normalize Norm, Norm</div><div class="code_line">End Sub</div></ol></div></div></div></div>]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712050</guid>
        <pubDate>Mon, 20 Mar 2017 08:37:23 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712050</link>
        <description><![CDATA[Mikle: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410532&view=findpost&p=3712036'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2017-03-20T08:07:29+00:00">20.03.17, 08:07</time></span><div class='quote '>Есть такой подход для генерации перпендикулярного вектора в 3D</div></div><br>
Длинно, два if-а, потом ещё определять понятие &quot;следующий&quot;, что тоже без if-ов трудно представить.<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">V1 = Vec3(Rnd, Rnd, Rnd)</div></ol></div></div></div></div><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">If Abs(Norm.x) &#60; Abs(Norm.y) Then</div><div class="code_line">&nbsp;&nbsp;V1 = Vec3(1, 0, 0)</div><div class="code_line">Else</div><div class="code_line">&nbsp;&nbsp;V1 = Vec3(0, 1, 0)</div><div class="code_line">End If</div></ol></div></div></div></div><br>
Наверное, это самый простой вариант.<br>
Но остаётся в силе вопрос - в целом я задачу решил оптимально, или можно проще?]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712036</guid>
        <pubDate>Mon, 20 Mar 2017 08:07:29 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712036</link>
        <description><![CDATA[MBo: Есть такой подход для генерации перпендикулярного вектора в 3D:<br><br>Выбрать максимальный по амплитуде компонент из (dx, dy, dz). Пусть это будет dy. Записать на его место следующий в циклическом порядке, а сам компонент - на следующее место, изменив знак. Третий компонент обнулить.<br><br>Т.е. результат будет (0, dz, -dy)]]></description>
        <author>MBo</author>
        <category>Программирование графики</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712031</guid>
        <pubDate>Mon, 20 Mar 2017 07:55:37 +0000</pubDate>
        <title>Правильная трансформация нормалей.</title>
        <link>https://forum.sources.ru/index.php?showtopic=410532&amp;view=findpost&amp;p=3712031</link>
        <description><![CDATA[Mikle: Есть модель, состоящая из вертексов, и есть матрица преобразования этой модели. Необходимо преобразовать и зашить обратно в модель позиции и нормали.<br>
Задачу можно упростить: <br>
Предположим, что трансформация, задаваемая матрицей - это комбинация поворотов, скейлов и переносов, без перспективных искажений, то есть m14, m24 и m34 равны нулю. <br>
<br>
D3DXVec3TransformNormal не подходит, если матрица включает не только переносы и повороты, но и скейл. Нормализация нормалей после D3DXVec3TransformNormal - тоже не панацея, даже в результате чистого скейла нормали меняют направление (и должны менять, но не так, как меняют тут).<br>
Переносы от других преобразований отделяются легко, это m41, m42 и m43.<br>
Фактически D3DXVec3TransformNormal, умножая вектор на матрицу 3*3 (входящую в состав матрицы 4*4), уже игнорирует переносы, но эта матрица 3*3 содержит повороты и скейлы в смешанном виде, элементы m11, m22 и m33 зависят и от скейлов, и от поворотов.<br>
<br>
Я решил эту задачу, отказавшись от D3DXVec3TransformNormal:<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">Public Sub Transform(Norm As D3DVECTOR, M As D3DMATRIX)</div><div class="code_line">&nbsp;&nbsp;Dim V0 As D3DVECTOR</div><div class="code_line">&nbsp;&nbsp;Dim V1 As D3DVECTOR</div><div class="code_line">&nbsp;&nbsp;Dim V2 As D3DVECTOR</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;V1 = Vec3(Rnd, Rnd, Rnd)</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross V1, V1, Norm</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross V2, V1, Norm</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord V0, Vec3(0, 0, 0), M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord V1, V1, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3TransformCoord V2, V2, M</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Subtract V1, V1, V0</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Subtract V2, V2, V0</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Cross Norm, V2, V1</div><div class="code_line">&nbsp;&nbsp;D3DXVec3Normalize Norm, Norm</div><div class="code_line">End Sub</div></ol></div></div></div></div><br>
<br>
Длинновато, но работает правильно, единственное - есть опасность, что случайный вектор Vec3(Rnd, Rnd, Rnd) окажется сонаправленным с исходным. Вероятность мала, но есть. <br>
Как проще (без if-оф) получить случайный вектор, гарантированно не сонаправленный данному? Направленный в противоположную стороны тоже считается сонаправленным.<br>
Может есть вариант по-проще?]]></description>
        <author>Mikle</author>
        <category>Программирование графики</category>
      </item>
	
      </channel>
      </rss>
	