Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Просмотр темы
 Распечатать тему
найти UV точки, лежащей внутри треугольной грани?
wlastas
#1 Распечатать сообщение
Опубликовано 20.04.2009 13:02:14
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

Есть три вершины, образующие треугольную грань, для каждой из которых известны её 3d коорлинаты и UV координаты текстуры.
Есть вершина внутри грани(лежит в её плоскости ) с известными 3d координатами.
КАК найти, какие будут у этой вершины UV?
www.gamedev.ru/images/upl/1221_2.jpg
 
Chort
#2 Распечатать сообщение
Опубликовано 20.04.2009 20:03:34
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

Интерполировать Smile
Метод1
Надо найти UV координати точек на сторонах триугольника у которых одна координата равна точке D, например X. А потом уже по ним найти UV точки D.

На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
general
#3 Распечатать сообщение
Опубликовано 20.04.2009 20:20:44
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

я еще решаю.
в задаче не сказанно, лежит ли точка на биссектрисах углов треугольника.
Изменил(а) general, 20.04.2009 20:21:43
 
mike
#4 Распечатать сообщение
Опубликовано 20.04.2009 20:44:31
Аватар пользователя

Администратор сайта


Сообщений: 739
Зарегистрирован: 10.02.09

по ходу это что то из аналитической геометрии.

смотри -
Barycentric coordinates
(возможно поможет)
Изменил(а) mike, 20.04.2009 20:45:40
 
general
#5 Распечатать сообщение
Опубликовано 20.04.2009 23:05:10
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

с разбега не решил. тут нужно с чистой головой специально садиться и копать.
Изменил(а) general, 20.04.2009 23:06:12
 
wlastas
#6 Распечатать сообщение
Опубликовано 21.04.2009 00:41:48
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

о вершине известны ее 3d координаты и то что она ледит внутри треугольника. Остальное никак не привязано ни к биссектрисам ни к чему либо длругому
вот тут
http://www.gamedev.ru/code/forum/?id=82019
в посте 4 есть работающий пример находдени uv такой точки для частного случая -
треугольника на базовой плоскостии, собсвенно там предлагается спроецировать вершины треугольника и точку внутри него на какую либо из бьазовых плоскостей, после чего заюзать фунецию, приведенную в посте.

Собсвенно новый вопрос)
Как универсально повернуть треугольник и вершину внутри него так, чтобы он стал паралелен плоскости XZ (так чтоб y коордлинайтой y можн обылоб пренебреч)
Изменил(а) wlastas, 21.04.2009 00:44:33
 
general
#7 Распечатать сообщение
Опубликовано 21.04.2009 00:56:57
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

эту хрень можно расчитать по принципу тени, т.е. сделать теневую матрицу и преобразовать внутреннюю точку из одной плоскости (или пространства не важно) в другую (плоскость текстуры).
 
Chort
#8 Распечатать сообщение
Опубликовано 21.04.2009 12:31:48
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

Есть еще метод2 - интерполировать по расстояние до каждой вершины. Тогда

AD = (A -D).length
BD = (B -D).length
CD = (C -D).length

D.uv = (AD * A.uv + BD * B.uv + CD * C.uv) / (AD + BD + CD);
На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
wlastas
#9 Распечатать сообщение
Опубликовано 22.04.2009 03:30:56
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

Chort написал:
Есть еще метод2 - интерполировать по расстояние до каждой вершины. Тогда

AD = (A -D).length
BD = (B -D).length
CD = (C -D).length

D.uv = (AD * A.uv + BD * B.uv + CD * C.uv) / (AD + BD + CD);


эх мегакрасивое решение) но толи я чтото не допонял, толи формула неправильная((
для простоты пробуем на 2д
Загрузить источник  GeSHi: C#
  1.  
  2. Vector2 A = new Vector2(0,0), Auv = new Vector2(0,0);
  3. Vector2 B = new Vector2(10, 0), Buv = new Vector2(1,0);
  4. Vector2 C = new Vector2(0,10), Cuv = new Vector2(0,1);
  5. Vector2 D = new Vector2(1,2);
  6.  
  7. float AD = Vector2.Distance(A, D);
  8. float BD = Vector2.Distance(B, D);
  9. float CD = Vector2.Distance(C, D);
  10.  
  11. float u = (AD * Auv.X + BD * Buv.X + CD * Cuv.X) / (AD + BD + CD);
  12. float v = (AD * Auv.Y + BD * Buv.Y + CD * Cuv.Y) / (AD + BD + CD);
  13.  
  14. //u = 0.47
  15. //v = 0.41
  16. //по клеточкам выходит u = 0.1, v = 0.2
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2



www.dola-print.ru/Untitled-1.gif
 
general
#10 Распечатать сообщение
Опубликовано 22.04.2009 07:52:32
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

а если треугольник будет лежать в плоскости не поралельной плоскости текстуры?
тут реальный вариант с теневой матрицей, я просто сразу не оценил такую возможность.
 
Chort
#11 Распечатать сообщение
Опубликовано 22.04.2009 11:02:58
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

Мда... ты прав, метод не точен и его надо немного подправить, но даже так он не подходит для интерполяции текстурных координат. Но вот реализация метода1
Загрузить источник  GeSHi: C#
  1.  
  2. Vector2 A = new Vector2(0,0), Auv = new Vector2(0,0);
  3. Vector2 B = new Vector2(10, 0), Buv = new Vector2(1,0);
  4. Vector2 C = new Vector2(0,10), Cuv = new Vector2(0,1);
  5. Vector2 D = new Vector2(1,2);
  6.  
  7. if (C.X == A.X)
  8. {
  9. Vector2 t = A;
  10. Vector2 tuv = A;
  11.  
  12. A = B;
  13. B = t;
  14.  
  15. Auv = Buv;
  16. Buv = tuv;
  17. }
  18.  
  19. float a1 = (D.X - A.X) / (B.X - A.X);
  20. float a2 = (D.X - A.X) / (C.X - A.X);
  21.  
  22. Vector2 D1 = Vector2.Lerp(A, B, a1);
  23. Vector2 D2 = Vector2.Lerp(A, C, a2);
  24.  
  25. Vector2 D1uv = Vector2.Lerp(Auv, Buv, a1);
  26. Vector2 D2uv = Vector2.Lerp(Auv, Cuv, a2);
  27.  
  28. float ad = (D.Y - D1.Y) / (D2.Y - D1.Y);
  29.  
  30. Vector2 Duv = Vector2.Lerp(D1uv, D2uv, ad);
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2

На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
wlastas
#12 Распечатать сообщение
Опубликовано 22.04.2009 18:13:30
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

Chort написал:

if (C.X == A.X)
{
Vector2 t = A;
Vector2 tuv = A;

A = B;
B = t;

Auv = Buv;
Buv = tuv;
}



Vector2 tuv = Auv; наверно всёже)
результат похож на правду Smile

остальсь конвертировать в Vector3Shock
моск медленно плавился
Изменил(а) wlastas, 22.04.2009 18:15:43
 
wlastas
#13 Распечатать сообщение
Опубликовано 04.05.2009 23:41:15
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

до сих пор так и не решил но вроде наметились подвижки.
100% что для решения надо использовать Барицентрические координаты. Удалос немного почитать книжечку на русском языке про них, после чего нашел хороший пример,
Загрузить источник  GeSHi: C#
  1.  
  2. Barycentric coordinates will indeed let you map points from one triangle to another.
  3.  
  4. The barycentric coordinate of a point P with respect to the vertices A, B and C of a
  5. triangle ABC is a triplet of values, (a, b, c), such that P = a*A+b*B+c*C, with a+b+c=1.
  6. With appropriate values for a, b and c, P can assume the position of any point in the
  7. plane of ABC.
  8.  
  9. Given a different triangle DEF with vertices D, E and F, you can now map P into the plane of
  10. DEF to some point Q by computing Q=a*D+b*E+c*F.
  11. For instance, the barycentric coordinates (1,0,0), (0,1,0) and (0,0,1) would map
  12. A into D, B into E and C into F, respectively.
  13.  
  14. There are many ways of actually computing the barycentric coordinates (a, b, c)
  15. for P with respect to the triangle ABC. The perhaps simplest method uses the fact
  16. that a, b and c are proportional to ratios of specific (signed) triangle areas.
  17. If |ABC| denotes the area of the triangle with vertices A, B and C (given counter-clockwise
  18. in that specific order) then specifically you have that:
  19.  
  20. a = |PBC| / |ABC|,
  21. b = |PCA| / |ABC|,
  22. c = |PAB| / |ABC| = 1 - a - b
  23.  
  24. It's important that these areas are "signed", which simply means that when looking at
  25. the triangles from a fixed position, if their vertices are arranged counter-clockwise,
  26. the area is positive, and if clockwise, it's negative.
  27.  
  28. What remains is to actually compute |ABC| for some given points. This too can be done
  29. in many ways. A conceptually straightforward way (but somewhat expensive computation-
  30. wise) is to use the fact that a cross product of two vectors gives you a vector
  31. whose magnitude is twice the area of the triangle with those two vectors as its sides.
  32.  
  33. So, to compute (a, b, c) you would do something like this (assuming a reasonable C++
  34. vector class):
  35.  
  36. // Compute the normal of the triangle
  37. Vector N = Normalize(Cross(B-A,C-A));
  38.  
  39. // Compute twice area of triangle ABC
  40. float AreaABC = Dot(N,Cross(B-A,C-A));
  41.  
  42. // Compute a
  43. float AreaPBC = Dot(N,Cross(B-P,C-P));
  44. float a = AreaPBC / AreaABC;
  45.  
  46. // Compute b
  47. float AreaPCA = Dot(N,Cross(C-P,A-P));
  48. float b = AreaPCA / AreaABC;
  49.  
  50. // Compute c
  51. float c = 1.0f - a - b;
  52.  
  53. This computation can be made less computationally expensive by projecting
  54. the triangle and the point into one of the XY, XZ or YZ planes and performing
  55. the calculations there (which automatically reduces the computation by 1/3 as
  56. there is one less coordinate to perform calculations on).
  57.  
  58. You can test your code, making sure it's working, by computing:
  59.  
  60. Point PP = a*A + b*B + c*C;
  61. Point Zero = PP - P;
  62.  
  63. and making sure that the components of Zero are indeed (near) zero.
  64.  
Добавлено за 0.014 секунд, используя GeSHi 1.0.8.2

соотвественно насколько я понял, вычислив барицетрические коордлинаты для моей точки D, у меня есть весовые коэффиценты, которые я могу применить к известным uv в каждой из трёх вершин, и интерполяцией получить uv для D.
Собсвенно вопрос - как тут интерполировать?
Изменил(а) mike, 04.05.2009 23:48:23
 
general
#14 Распечатать сообщение
Опубликовано 04.05.2009 23:55:11
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

у каждого типа вектора vector2, vector3, vector4 есть свойство Lerp
Изменил(а) general, 04.05.2009 23:56:37
 
Chort
#15 Распечатать сообщение
Опубликовано 05.05.2009 00:02:43
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

А вот-так

Загрузить источник  GeSHi: C#
  1. Vector3 A = new Vector3(0, 0, 0); Vector2 Auv = new Vector2(0, 0);
  2. Vector3 B = new Vector3(10, 0, 0); Vector2 Buv = new Vector2(1, 0);
  3. Vector3 C = new Vector3(0, 10, 0); Vector2 Cuv = new Vector2(0, 1);
  4. Vector3 D = new Vector3(1, 1, 0);
  5.  
  6. Vector3 N = Vector3.Normalize(Vector3.Cross(B - A, C - A));
  7.  
  8. float AreaABC = Vector3.Dot(N, Vector3.Cross(B - A, C - A));
  9. float AreaPBC = Vector3.Dot(N, Vector3.Cross(B - D, C - D));
  10. float AreaPCA = Vector3.Dot(N, Vector3.Cross(C - D, A - D));
  11.  
  12. float b = AreaPCA / AreaABC;
  13. float a = AreaPBC / AreaABC;
  14. float c = 1.0f - a - b;
  15.  
  16. Vector2 Duv = a * Auv + b * Buv + c * Cuv;
Добавлено за 0.007 секунд, используя GeSHi 1.0.8.2

На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
wlastas
#16 Распечатать сообщение
Опубликовано 05.05.2009 00:07:53
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

лерп требует 2 базовых значения и коэффицент смещения - не вижу некакйо сязи с моим случаем) у меня ТРИ VEctor2, к кадому из которых есть весовой коэффицент
объясните тупому чуть поодробнее))
 
Chort
#17 Распечатать сообщение
Опубликовано 05.05.2009 00:21:52
Аватар пользователя

Администратор


Сообщений: 1296
Зарегистрирован: 16.02.09

1) не свойство, а метод Lerp
2) ну можно сделать через два-три Lerp"а, вместо a * Auv + b * Buv + c * Cuv;
3) в твоем случае весовые коэффициенты для позиций точек такие же как и весовые коэффициенты для текстурных координат
На вопросы отвечаю с головы. Ссылка на ответы или запускаю студию только в интересных случаях.
 
wlastas
#18 Распечатать сообщение
Опубликовано 05.05.2009 00:27:35
Специалист


Сообщений: 94
Зарегистрирован: 28.03.09

Chort написал:
А вот-так

Vector2 Duv = a * Auv + b * Buv + c * Cuv;


та я тод так попробовал сразу - результат неверный((

вот uv взятый с 3д редлактора
Загрузить источник  GeSHi: C#
  1.  
  2. Vector3 A = new Vector3(1, 0, 0); Vector2 Auv = new Vector2(0, 0);
  3. Vector3 B = new Vector3(10f, 4f, 4f); Vector2 Buv = new Vector2(1, 0);
  4. Vector3 C = new Vector3(0, 6f, 13f); Vector2 Cuv = new Vector2(0.5f, 1);
  5. Vector3 D = new Vector3(4, 3, 5);
  6. Vector3 N = Vector3.Normalize(Vector3.Cross(B - A, C - A));
  7. float AreaABC = Vector3.Dot(N, Vector3.Cross(B - A, C - A));
  8. float AreaPBC = Vector3.Dot(N, Vector3.Cross(B - D, C - D));
  9. float AreaPCA = Vector3.Dot(N, Vector3.Cross(C - D, A - D));
  10. float b = AreaPCA / AreaABC;float a = AreaPBC / AreaABC;
  11. float c = 1.0f - a - b;
  12. Vector2 Duv = a * Auv + b * Buv + c * Cuv;
  13.  
Добавлено за 0.009 секунд, используя GeSHi 1.0.8.2


АААААААА ЕЕЕЕЕЕЕЕЕЕЕЕЕ !!!! работает!!! - Vector3 D = new Vector3(4, 3, 5); а не старыйЁ!!!! ура спсп!!!

получилось {X:0,4969663 Y:0,2707435} а в редакторе 0,495 0,272 но я на глаз мапинг клал!!!
Изменил(а) wlastas, 05.05.2009 00:32:51
 
general
#19 Распечатать сообщение
Опубликовано 05.05.2009 18:11:55
Аватар пользователя

Администратор сайта


Сообщений: 3788
Зарегистрирован: 10.02.09

Сегодня в обеденный перерыв тоже решал. Как видно не успел. Но решением поделюсь. Вот еще один способ.

Загрузить источник  GeSHi: C#
  1. using System;
  2. using Microsoft.Xna.Framework;
  3.  
  4. namespace Test
  5. {
  6. public class TestMath2
  7. {
  8. public TestMath2()
  9. {
  10. // вершины треугольника
  11. Vector3 A = new Vector3(1f, -1f, 0f);
  12. Vector3 B = new Vector3(3f, -4f, 0f);
  13. Vector3 C = new Vector3(5f, -1f, 0f);
  14. // текстурные координаты вершин
  15. Vector2 tA = new Vector2(1f, 1f);
  16. Vector2 tB = new Vector2(3f, 4f);
  17. Vector2 tC = new Vector2(5f, 1f);
  18. // точка в плоскости треугольника ограниченная его гранями
  19. Vector3 D = new Vector3(3f, -2f, 0f);
  20. // B
  21. // .
  22. // / \
  23. // / \
  24. // / \
  25. // / .D \
  26. // / \
  27. // .-----------.
  28. // A C
  29. // расчет
  30. Vector2 tD = CalculationDuvFromABC( A, tA,
  31. B, tB,
  32. C, tC,
  33. D);
  34. }
  35. /// <summary>
  36. /// Нахождение текстурных координат точки D
  37. /// </summary>
  38. /// <param name="A">Позиция точки A</param>
  39. /// <param name="tA">Текстурные координаты точки A</param>
  40. /// <param name="B">Позиция точки B</param>
  41. /// <param name="tB">Текстурные координаты точки B</param>
  42. /// <param name="C">Позиция точки C</param>
  43. /// <param name="tC">Текстурные координаты точки C</param>
  44. /// <param name="D">Позиция точки D</param>
  45. /// <returns>Текстурные координаты точки D</returns>
  46. private Vector2 CalculationDuvFromABC( Vector3 A, Vector2 tA,
  47. Vector3 B, Vector2 tB,
  48. Vector3 C, Vector2 tC,
  49. Vector3 D)
  50. {
  51. Vector3 E = PointOfLinesCrossing(A, B, C, D);
  52. float kAEC = (E - A).Length() / (C - A).Length();
  53. Vector2 tE = tA + (tC - tA) * kAEC;
  54. float kBDE = (D - B).Length() / (E - B).Length();
  55. return (Vector2)(tB + (tE - tB) * kBDE);
  56. }
  57. /// <summary>
  58. /// Нахождение позиции точки пересечения двух прямых,
  59. /// проходящих через точки AC и BD
  60. /// </summary>
  61. /// <param name="A">Позиция точки A</param>
  62. /// <param name="B">Позиция точки B</param>
  63. /// <param name="C">Позиция точки C</param>
  64. /// <param name="D">Позиция точки D</param>
  65. /// <returns>Позиция точки E, полученной пересечением двух прямых AC и BD</returns>
  66. private Vector3 PointOfLinesCrossing(Vector3 A, Vector3 B, Vector3 C, Vector3 D)
  67. {
  68. Vector3 vecAC = C - A;
  69. Vector3 vecBD = D - B;
  70. float Tac = Math.Abs( Matrix2x2Determinant( vecBD.X, A.X - B.X,
  71. vecBD.Y, A.Y - B.Y)
  72. /
  73. Matrix2x2Determinant( vecBD.X, vecAC.X,
  74. vecBD.Y, vecAC.Y));
  75. return Vector3.Add(A, Vector3.Multiply(vecAC, Tac));
  76. }
  77. /// <summary>
  78. /// Определитель матрицы 2х2
  79. /// </summary>
  80. /// <param name="a00">a00</param>
  81. /// <param name="a01">a01</param>
  82. /// <param name="a10">a10</param>
  83. /// <param name="a11">a11</param>
  84. /// <returns>Определитель</returns>
  85. private float Matrix2x2Determinant( float a00, float a01,
  86. float a10, float a11)
  87. {
  88. return (float)(a00 * a11 - a10 * a01);
  89. }
  90. }
  91. }
Добавлено за 0.021 секунд, используя GeSHi 1.0.8.2

Изменил(а) general, 05.05.2009 18:16:13
 
Перейти на форум:
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 1,54 секунд 8,709,854 уникальных посетителей