|
|
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Эта тема продолжение вот этой . Пытаюсь создать класс камеры, где была бы возможность двигать камеру вокруг объекта(в данном случае вокруг центра сферы). В прикрепленном архиве есть проект и само приложение. Проблема заключается в том, что когда я нажимаю кнопки A или D, т.е. в лево и вправо, то куб в центре вращается нормально(точнее камера вокруг него), когда W или S, вверх и вниз, то тоже нормально, но когда после W или S я нажимаю A или D куб куда-то уезжает. Т.е. он начинает двигаться по кругу. И чем больше удерживаешь W или S, тем больше становиться размер круга. Пример: 1.Нажал D - работает 2.Нажал W - работает 3.Нажал D - уезжает или вот так 1.Нажал W - работает 2.Нажал D - уезжает. Т.е. при движении камеры по оси Y что-то сбивается, а что понять не могу. Приведу пример класса камеры и вызов процедуры вращения: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. вызов Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. возможно проблема вот в этой формуле, но как она работает я понять не могу Код: c# 1. Подскажите пожалуйста, как решить эту проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 11:18 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Kokon, Если хочешь двигать камеру по сфере? то придется отказаться от отдельных движений по оси X и по оси Y и крутить всегда в 3D. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 14:41 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
и крутить всегда в 3D а можно поподробнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 14:55 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Kokon, Поподробнее - это с картинками и матрицами вращения, потому что проблема не в одной формуле... 1. Нужно определится с системой координат и что меняется при нажатии кнопок. 1.1. Можно взять направляющие углы, pitch и direction подойдут. Но тогда у тебя будет полюса, в которых нельзя пользоваться формулами -= и +=. Грубо говоря, когда ты пешком проходишь через точку Северного полюса на Земле, то у тебя скачком меняется долгота (direction), а широта сначала увеличивается, а потом уменьшается, хотя ты никуда не прыгал и не менял направление движения. 1.2. Можно взять только 3D координаты камеры и задать стартовое направление на кадре "вверх", и при нажатии кнопок "вращать относительно текущей (а не X или Y) оси, параллельной стороне кадра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 15:11 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Kokon, В приложении прога с кубиком. Такой результат ожидаешь? Если да - то я скину исходник(скорее всего это будет уже в пятницу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 19:16 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
wvetal, у меня к сожалению приложение не запускается. выложи пожалуйста исходники. я посмотрю их, может подойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2013, 20:00 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
wvetal, на другом компе запустилось. то что надо))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2013, 08:14 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Kokonwvetal, на другом компе запустилось. то что надо))) Тогда выкладываю исходники. 1) тебе достаточно будет только заменить файл Form1.cs в твоем проекте (я его дам отдельно в приложении + там еще будет весь солюшн с моим проектом под VS2005, даю на всякий случай) 2) класс Camera, который у тебя описан в Camera.cs я вообще не использовал. Файл Form1.cs: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2013, 12:08 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
wvetal, большое спасибо. работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2013, 15:42 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Kokon, А какую литературу ты используешь для DirectX и C#? ... и еще... там нажатие клавиш лучше обрабатывать не Код: c# 1. а делать через DirectInput Код: c# 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2013, 16:29 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
wvetal, по с# я видел только одну книгу Тома Миллера. А остальное статьи, книги по с++, а вообще делаю простенький 3D редактор, ну просто для того чтобы не просто так изучать directx, а выполняя конкретную задачу. Так интереснее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2013, 19:52 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Косяк один обнаружил. Когда камера двигается вертикально (кнопки S или W) то получается, что она вращается относительно оси Х и когда она передвигается на 90 град, т.е. смотрит сверху вниз на ось Y мировых координат и если при этом нажимать на A или D тогда камера вращается вокруг оси Y, а выглядит так что куб крутится вокруг своей оси. Т.е. когда мы с боку смотрим на куб, то он правильно поворачивается, а когда сверху, то математически тоже правильно, но выглядит это не так как надо. Получается когда мы смотрим на куб сверху вниз и нажимаем на A или D тогда надо вращаться не вокруг оси Y, а вокруг оси Z. Т.е. определять в каком положении находится камера и в зависимости от этого вращаться вокруг определенных осей. Вот такая фигня. Пока еще не понял как это решить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2013, 11:13 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Хотя наверно это правильно. Посмотрел в 3D редакторах, там тоже самое. Если на сцену сверху вниз смотришь, то она вращается по кругу. Так что это не косяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2013, 12:05 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonЭта тема продолжение вот этой .Там и надо было продолжать писать (не закрыто же), тема та же, незачем было новое обсуждение создавать. Ну да ладно, это мелочь. Kokonвозможно проблема вот в этой формуле, но как она работает я понять не могу Код: c# 1. Формулу поворота точки вокруг оси вы скопировали правильно, в ней проблем быть не должно. Если хотите, объясню, как она получена. Вот другие вещи вы скопировали с изменениями, например использовали другую систему координат. Мой код : Пётр Седов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Ваш код: Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Мой код работает правильно (камера вращается так же, как в 3ds max), но правильность вашего изменённого варианта я уже гарантировать не могу. 2 wvetal: wvetal Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. Это не то вращение камеры, которое в 3ds max (и его бесплатном варианте, gmax ). Это упрощённый вариант, когда камера всегда смотрит точно в центр вращения (за-hardcode-енный в {0, 0, 0}), так что он всегда проецируется точно в центр viewport-а. Но если в качестве центра вращения брать центр выделенного объекта, то не совсем понятно, как при таком подходе переключаться на другой объект. Резко менять ориентацию камеры? (раньше смотрела точно в центр старого объекта, теперь смотрит точно в центр нового объекта) Пользователю будет неприятно. Впрочем, если Kokon-у такой упрощённый вариант подходит (может, у него всегда будет ровно один объект), то хорошо, просто раньше он писал : Kokonа вообще я хочу сделать чтобы камера облетала сцену как это сделано в 3d max или в любом другом 3d редакторе. Ну и один и тот же код 4 раза -- неправильно, надо избегать дублирования кода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. (код не компилировал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2013, 04:56 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Вот сделал почти точно по вашему коду. Поменял только double на float. Код: c# 1. ну я думаю это не принципиально. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. но когда я нажимаю на какую-нибудь кнопку, куб исчезает, видимо камера вообще улетает куда-то или смотрит в другую сторону. В приложении и проект есть и само приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2013, 13:27 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonПоменял только double на float.Это да, не принципиально. Kokon Код: c# 1. У меня вначале камера смотрит вниз (начальный _cam_pitch = -45 °), поэтому желательно, чтобы вначале камера была «над землёй» (начальный _cam_pos.z > 0), иначе вы не увидите объект, расположенный в {0, 0, 0}. Ну и начальный _cam_pos.y желательно подобрать так, чтобы камера не попала внутрь объекта. Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Выделенные строки -- лишние, их нет в моём коде . Оси камеры в мировых координатах (векторы _cam_dir, _cam_right, _cam_up) полностью рассчитываются в функции calc_cam_axes, дополнительные действия не нужны (например, не надо их нормализовывать, они и так единичные). Kokon Код: c# 1. 2. 3. 4. Лучше убрать эту инициализацию, и вместо неё добавить вызов функции calc_cam_axes в конструкторы класса Camera: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. (код не компилировал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2013, 19:03 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, вращается хорошо, спасибо. Только перспектива как-то сильно стала заметна. У куба передняя поверхность заметно меньше, чем задняя. Хотя это наверно у меня в коде косяк какой-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2013, 13:42 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonТолько перспектива как-то сильно стала заметна.Чтобы ослабить «перспективность», попробуйте отодвинуть камеру подальше от объекта. Ещё можно уменьшить угол обзора, указываемый при вызове Matrix.PerspectiveFovLH. Кстати, по поводу этого вызова: ваш код Код: c# 1. Целочисленное деление здесь не подходит. Поэтому, скорее всего, надо добавить приведение к типу float. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 05:24 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, подключил класс камеры к другому проекту. Там нарисована координатная сетка и оси координат. Вращается она как-то странно. Когда на W или S нажимаешь, то все нормально, а когда на A или D, то она вращается не вокруг оси Y, а вокруг оси Z. Не понятно то ли вращение неправильное, то ли камера не правильно установлена. Сетка вроде правильно рисуется, просто по координатам точек. Что интересно, в проекте с кубом все хорошо. Он вращается как надо. А здесь косяк. Приведу код. Вот код формы где все рисуется Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. а вот код камеры Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2013, 17:40 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonТам нарисована координатная сетка и оси координат. Вращается она как-то странно. Когда на W или S нажимаешь, то все нормально, а когда на A или D, то она вращается не вокруг оси Y, а вокруг оси Z.Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. У вас, похоже, сетка лежит в плоскости «y = 0». А я писал код, подразумевая традиционную мировую систему координат, в которой «поверхность земли» -- это плоскость «z = 0», а также: * ось x идёт «по земле» на восток * ось y идёт «по земле» на север * ось z идёт вертикально вверх, «в небо» Кстати, именно такая мировая система координат используется в 3ds max (и gmax), и я вам советую перейти на неё. KokonЧто интересно, в проекте с кубом все хорошо. Он вращается как надо.Куб одинаковый по всем осям, поэтому расхождение в системе координат незаметно. Kokon Код: c# 1. Да, с float-овым делением должно быть правильно. Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Осторожно, много-поточность -- не для начинающих. Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. В данном случае лучше перевести «строки» как «rows», а не «strings». Kokon Код: c# 1. Зачем умножать на -1, есть же унарный минус: -marginCoord. Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Лучше вставить вызов метода calc_cam_axes и во второй конструктор тоже, он ничем не хуже первого :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 03:47 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, поменял оси теперь сетка хорошо вращается. Теперь возникла другая проблема))))) Я в своем проекте сделал чтобы по клику мыши рисовался или куб или цилиндр. Когда была просто статичная камера(через LookAt сделанная), то рисовалось все правильно, а вот когда динамику добавил примитивы уже рисуются где попало. Допустим когда в центр сетки кликаешь, координаты не 0,0,0 выдаются, а вообще левые цифры. И при этом кликнул в центре сетки одни координаты, не сдвигая курсора покрутил камеру, снова кликнул уже другие. Т.е. получается будто бы координаты клика зависят от положения камеры. Я прикрепил файл там как раз можно это увидеть. а координаты я в этом коде определяю Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. при этом если курсор на центр сетки поставить и вращать ее вертикально то заметно что центр сильно смещается относительно курсора, а если в стороны то смещения не происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2013, 16:48 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonДопустим когда в центр сетки кликаешь, координаты не 0,0,0 выдаются, а вообще левые цифры.Попробуйте размещать новые объекты так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. (код не компилировал) Если не поможет, покажите код, как создаёте/рисуете объекты. Kokonпри этом если курсор на центр сетки поставить и вращать ее вертикально то заметно что центр сильно смещается относительно курсора, а если в стороны то смещения не происходит.Насколько я понял, вы зачем-то рисуете сетку со смещением вверх на 1: Kokon Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Таким образом, сетка лежит в плоскости «z = 1». Рисуйте сетку без смещения, чтобы она лежала в плоскости «z = 0»: Код: c# 1. 2. 3. (код не компилировал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 05:20 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, все классно работает и рисование объекта и его выделение и повороты. Спасибо! У меня сетка была сдвинута по оси Z потому что когда я примитив рисовал сетка тоже устанавливалась в в его положение, т.е. постоянно сдвигалась. А про то чтобы сделать при рисовании сетки единичную матрицу я тогда и не догадался. Теперь все хорошо. Кстати на счет многопоточности. Я ее использовал для того чтобы можно было рисовать на панели, а не только на форме. Просто когда на форме рисовал использовал событие onPaint, а для панели им воспользоваться не получилось, уже точно не помню почему, но не работало так как надо. Вот и пришлось использовать потоки. Хотя и с ними проблем хватает, например не могу обратиться к элементам на форме, потому что они созданы в другом потоке. Ну это я на потом оставил, хотел сначала с камерой и созданием примитивов разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2013, 11:42 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonКстати на счет многопоточности. Я ее использовал для того чтобы можно было рисовать на панели, а не только на форме.Всё-таки должен быть какой-то способ рисовать на панели без использования много-поточности (которая здесь не обоснована и может создать серьёзные проблемы). Ну как-то типа: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. (код не компилировал) Kokonхотел сначала с камерой и созданием примитивов разобраться.Кстати, по поводу вращения камеры. В разных 3D-редакторах это по-разному сделано. В Blender -е например другой способ, можете глянуть. Но мне max-овский способ привычнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2013, 02:41 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, пытаюсь привязать вращение камеры к движению мыши. вроде сначала казалось, что легко, а на деле оказывается, что не совсем легко. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. получается, что moveX и moveY не всегда обнуляются, т.е. когда точно двигаю мышью по Х(в экранных координатах) Y не меняется, то вращается все правильно, а когда двину по Y, то moveY потом не обнуляется и камера вращается как попало в обоих плоскостях. Хотя при наступлении этого события эти переменных должны обнуляться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2013, 20:27 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: Зачем так сложно? Попробуйте проще: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. (код не компилировал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2013, 04:44 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов,как все просто оказалось))) Спасибо, работает как надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2013, 08:28 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: Кстати, если вас смущает моя реализация функции rotate, то можете попробовать такую: Код: c# 1. 2. 3. 4. (код не компилировал) Вроде должно работать так же, только насчёт минуса перед углом не уверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 03:32 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, да меня то формула не смущает. Просто я ее не понимаю. Если не лень объясните пожалуйста. А в ее сами вывели или где-то она расписана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 13:38 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, кстати не знаете, что можно почитать об архитектуре 3D приложений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2013, 17:18 |
|
||
|
DirectX вращение камеры вокруг центра
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonПётр Седов, да меня то формула не смущает. Просто я ее не понимаю. Если не лень объясните пожалуйста. А в ее сами вывели или где-то она расписана?Сейчас уже не помню точно, но скорее всего поворот точки вокруг произвольной оси я взял из книги «Advanced Animation and Rendering Techniques» (авторы: Alan Watt, Mark Watt): (в первом абзаце возможно имеется в виду «of an amount θ about an axis n ») 15 Overview and low-level motion specification ... 15.3 Motion control ... 15.3.8 Parametrization of orientation ... Angular displacement We define orientation as an angular displacement given by ( θ , n ) of an amount about an axis n . Just as we did for Euler angle notation, we shall derive the rotational matrix in terms of this new notation, so instead of R ( θ 1 , θ 2 , θ 3 ) we write R ( θ , n ). Consider the angular displacement acting on a vector r taking it to position Rr as shown in Figure 15.20. The problem can be decomposed by resolving r into components parallel to n , r ∥ , which by definition remains unchanged after rotation, and perpendicular to n , r ⊥ in the plane passing through r and Rr . r ∥ = ( n · r ) n r ⊥ = r - ( n · r ) n r ⊥ is rotated into position Rr ⊥ . We construct a vector perpendicular to r ⊥ and lying in the plane. In order to evaluate this rotation, we write: V = n × r ⊥ = n × r So Rr ⊥ = (cos θ ) r ⊥ + (sin θ ) V hence Rr = Rr ∥ + Rr ⊥ = Rr ∥ + (cos θ ) r ⊥ + (sin θ ) V = ( n · r ) n + cos θ ( r - ( n · r ) n ) + (sin θ ) n × r = (cos θ ) r + (1 - cos θ ) n ( n · r ) + (sin θ ) n × r Мой код : Пётр Седов Код: plaintext 1. 2. 3. 4. 5. 6. 7. Не знаю, как у вас с английским, в общем там ключевой момент в том, что вектор r (который надо повернуть) разбивается на 2 части: r = r ∥ + r ⊥ r ∥ параллелен оси вращения, r ⊥ перпендикулярен. Нам надо получить Rr , и поскольку вращение -- линейный оператор, то: R ( r ∥ + r ⊥ ) = Rr ∥ + Rr ⊥ С параллельной частью всё просто: Rr ∥ = r ∥ . С перпендикулярной частью чуть посложнее, похоже на полярные координаты: Rr ⊥ = cos θ r ⊥ + sin θ V . Они там не пишут явно, но имеют в виду: * Ось вращения проходит через начало координат (точка {0, 0, 0}). Обобщить на случай, когда не проходит, легко: сначала переходим в систему координат, где ось вращения проходит через начало координат, делаем поворот, затем возвращаемся в исходную систему координат. Пётр Седов Код: plaintext 1. 2. 3. * Вектор n (направление оси вращения; в моём коде -- axis_dir) -- единичный. Пётр Седов Код: plaintext 1. KokonПётр Седов, кстати не знаете, что можно почитать об архитектуре 3D приложений?Не знаю. Но подозреваю, что архитектура 3D-редакторов более/менее такая же, как у обычных редакторов, отличается только рисование объектов и hit test (обнаружение, на какой объект щёлкнул пользователь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2013, 05:00 |
|
||
|
|

start [/forum/search_topic.php?author=tangar&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
12ms |
get forum list: |
21ms |
get settings: |
11ms |
get forum list: |
22ms |
get settings: |
10ms |
get forum list: |
18ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 2565ms |
| total: | 2929ms |

| 0 / 0 |
