Навигация
· 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 - Дом для вашего сайта
Статистика посещений:

Просмотр темы
 Распечатать тему
Коллизия в C++
CSharpCraft
#1 Распечатать сообщение
Опубликовано 31.08.2013 10:07:14
Аватар пользователя

Специалист


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

Всем доброго времени суток!

Алгоритм физической коллизии двух MeshShape (по сути два массива вершин) я решил перенести в C++ с целью улучшения производительности. Теперь возник такой вопрос: как правильно ее загрузить? Вот с таким синтаксисом:...

Загрузить источник  GeSHi: C#
  1.  
  2. [DllImport("NativeUW.dll", EntryPoint = "_IntersectsCollision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  3. public static extern bool IntersectsCollision(Vector3[] array1, Vector3[] array2, Vector3 array1Position, Vector3 array2Position, float testSize);
  4.  
Добавлено за 0.006 секунд, используя GeSHi 1.0.8.2


возникает ошибка: Не удается найти точку входа "_IntersectsCollision"

Функция в C++ выглядит так:

Загрузить источник  GeSHi: C#
  1.  
  2. static bool IntersectsCollision(Vector3 array1 [], Vector3 array2 [], Vector3 array1Position, Vector3 array2Position, float testSize)
  3. {
  4.  
  5. float count1 = (float) sizeof(array1) / (float) (sizeof(float) * 3);
  6. float count2 = (float) sizeof(array2) / (float) (sizeof(float) * 3);
  7.  
  8. for (int index1 = 0; index1 < count1; index1++)
  9. for (int index2 = 0; index2 < count2; index2++)
  10. {
  11. Vector3 item1 = array1[index1];
  12. Vector3 item2 = array2[index2];
  13. item1.x += array1Position.x;
  14. item1.y += array1Position.y;
  15. item1.z += array1Position.z;
  16. item2.x += array2Position.x;
  17. item2.y += array2Position.y;
  18. item2.z += array2Position.z;
  19.  
  20. //Проверка коллизии
  21. float num1 = item1.x - item2.x;
  22. float num2 = item1.y - item2.y;
  23. float num3 = item1.z - item2.z;
  24. float num4 = num1 * num1 + num2 * num2 + num3 * num3;
  25. if (sqrt(num4) < testSize)
  26. return true;
  27. }
  28.  
  29. return false;
  30. }
  31.  
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2
 
gugenot
#2 Распечатать сообщение
Опубликовано 31.08.2013 12:05:10
Аватар пользователя

Специалист


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

Может проблема в "_IntersectsCollision"?
Изменил(а) gugenot, 31.08.2013 12:07:15
У меня настенный календарь на месяц заканчивается. За билетами на церемонию конца света обращайтесь в личку.
 
CSharpCraft
#3 Распечатать сообщение
Опубликовано 31.08.2013 12:15:38
Аватар пользователя

Специалист


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

gugenot написал:
Может проблема в "_IntersectsCollision"?


Если вы про "_" то нет
Изменил(а) CSharpCraft, 31.08.2013 12:16:06
 
CSharpCraft
#4 Распечатать сообщение
Опубликовано 31.08.2013 12:17:48
Аватар пользователя

Специалист


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

Просто эти функции компилируются из Method в _Method. Хотя я по всякому пробовал
 
HOMPAIN
#5 Распечатать сообщение
Опубликовано 31.08.2013 12:31:08
Старший специалист


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

А что такое Vector3 в си++. Нормально вектор из XNA приводится к тому что в си++?
 
gugenot
#6 Распечатать сообщение
Опубликовано 31.08.2013 12:33:59
Аватар пользователя

Специалист


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

C# http://msdn.micro...s.90).aspx
Загрузить источник  GeSHi: C#
  1. [System.Runtime.InteropServices.DllImport("user32.dll")]
  2. extern static void SampleMethod();
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2

C++http://msdn.micro...s.71).aspx
Не то?

ЗЫ А вообще мысль неплохая. Когда заработает, отпишитесь, хорошо ли помогает?
Изменил(а) gugenot, 31.08.2013 12:40:54
У меня настенный календарь на месяц заканчивается. За билетами на церемонию конца света обращайтесь в личку.
 
CSharpCraft
#7 Распечатать сообщение
Опубликовано 31.08.2013 12:34:49
Аватар пользователя

Специалист


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

Я забыл __declspec( dllexport ) и extern "C". Вопрос решен.
 
CSharpCraft
#8 Распечатать сообщение
Опубликовано 31.08.2013 12:35:34
Аватар пользователя

Специалист


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

gugenot а за инфу спасибо
 
CSharpCraft
#9 Распечатать сообщение
Опубликовано 31.08.2013 12:41:32
Аватар пользователя

Специалист


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

gugenot написал:
ЗЫ А вообще мысль неплохая. Когда заработает, отпишись, хорошо ли помогает?


Как только налажу отпишусь в этой теме))
 
CSharpCraft
#10 Распечатать сообщение
Опубликовано 31.08.2013 13:07:20
Аватар пользователя

Специалист


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

СУПЕР!! Все просто летает!!! 40к * 40к ИТЕРАЦИЙ!!!

Вот что я сделал в C++:

Загрузить источник  GeSHi: C#
  1.  
  2. extern "C" DllExport bool __stdcall IntersectsCollision(Vector3 array1 [], Vector3 array2 [], Vector3 array1Position, Vector3 array2Position, float testSize)
  3. {
  4.  
  5. float count1 = (float) sizeof(array1) / (float) (sizeof(float) * 3);
  6. float count2 = (float) sizeof(array2) / (float) (sizeof(float) * 3);
  7.  
  8. for (int index1 = 0; index1 < count1; index1++)
  9. for (int index2 = 0; index2 < count2; index2++)
  10. {
  11. Vector3 item1 = array1[index1];
  12. Vector3 item2 = array2[index2];
  13. item1.x += array1Position.x;
  14. item1.y += array1Position.y;
  15. item1.z += array1Position.z;
  16. item2.x += array2Position.x;
  17. item2.y += array2Position.y;
  18. item2.z += array2Position.z;
  19.  
  20. //Проверка коллизии
  21. float num1 = item1.x - item2.x;
  22. float num2 = item1.y - item2.y;
  23. float num3 = item1.z - item2.z;
  24. float num4 = num1 * num1 + num2 * num2 + num3 * num3;
  25. if (sqrt(num4) < testSize)
  26. return true;
  27. }
  28.  
  29. return false;
  30. }
  31.  
Добавлено за 0.009 секунд, используя GeSHi 1.0.8.2


Vector3 в C++:
Загрузить источник  GeSHi: C#
  1.  
  2. #pragma once
  3. class Vector3
  4. {
  5. public:
  6. Vector3(float x, float y, float z);
  7. ~Vector3();
  8. float x;
  9. float y;
  10. float z;
  11. };
  12.  
  13. //====
  14.  
  15. #include "stdafx.h"
  16. #include "Vector3.h"
  17. Vector3::Vector3(float x, float y, float z)
  18. {
  19. this->x = x;
  20. this->y = y;
  21. this->z = z;
  22. }
  23. Vector3::~Vector3()
  24. {
  25. }
  26.  
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2


Вызов из C#:
Загрузить источник  GeSHi: C#
  1.  
  2. [DllImport("NativeUW.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
  3. public static extern bool IntersectsCollision(Vector3[] array1, Vector3[] array2, Vector3 array1Position, Vector3 array2Position, float testSize);
  4.  
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2


Применение:
Загрузить источник  GeSHi: C#
  1.  
  2. public bool IsCollision(Rigidbody3D sender)
  3. {
  4. BoundingSphere a = new BoundingSphere(_parent.CurrentNormalTransform.Translation, _parent.Size);
  5. BoundingSphere b = new BoundingSphere(sender._parent.CurrentNormalTransform.Translation, sender._parent.Size);
  6. if (a.Intersects(b))
  7. return InternalHelper.IntersectsCollision(trs.PositionBuffer, sender.trs.PositionBuffer,
  8. _parent.CurrentNormalTransform.Translation, sender._parent.CurrentNormalTransform.Translation, 2);
  9. return false;
  10. }
  11.  
Добавлено за 0.006 секунд, используя GeSHi 1.0.8.2


Удивительно, что даже массив структур Vector3 передается правильно)))
И еще: эту библиотеку на C++ можно спокойно дебажить))
Изменил(а) CSharpCraft, 31.08.2013 13:08:58
 
CSharpCraft
#11 Распечатать сообщение
Опубликовано 31.08.2013 13:10:40
Аватар пользователя

Специалист


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

Теперь добавлю матрицы для изменения вершин в соответствие с трансформациями объекта сцены и дело в шляпе))
Только количество элементов в массиве тоже нужно передавать из C#
Изменил(а) CSharpCraft, 31.08.2013 13:17:18
 
HOMPAIN
#12 Распечатать сообщение
Опубликовано 31.08.2013 13:43:40
Старший специалист


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

CSharpCraft написал:
Теперь добавлю матрицы для изменения вершин в соответствие с трансформациями объекта сцены и дело в шляпе))
Только количество элементов в массиве тоже нужно передавать из C#


А вроде функции для трансформации вершин в XNA векторах и так нативные. Если сделаешь, пожалуйста, напишу будет ли прирост.
 
CSharpCraft
#13 Распечатать сообщение
Опубликовано 31.08.2013 14:10:54
Аватар пользователя

Специалист


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

HOMPAIN написал:
CSharpCraft написал:
Теперь добавлю матрицы для изменения вершин в соответствие с трансформациями объекта сцены и дело в шляпе))
Только количество элементов в массиве тоже нужно передавать из C#


А вроде функции для трансформации вершин в XNA векторах и так нативные. Если сделаешь, пожалуйста, напишу будет ли прирост.


Вот финальный алгоритм:
Загрузить источник  GeSHi: C#
  1.  
  2. extern "C" DllExport bool __stdcall IntersectsCollision(
  3. Vector3 array1 [], Vector3 array2 [],
  4. Vector3 array1Position, Vector3 array2Position,
  5. float testSize,
  6. int array1Count, int array2Count,
  7. Vector3 matrix1_M1, Vector3 matrix1_M2, Vector3 matrix1_M3,
  8. Vector3 matrix2_M1, Vector3 matrix2_M2, Vector3 matrix2_M3)
  9. {
  10. Vector3* array1Ptr = &array1[0];
  11. Vector3* array2Ptr = &array2[0];
  12.  
  13.  
  14.  
  15. for (int index1 = 0; index1 < array1Count; index1++)
  16. {
  17. Vector3 *item1 = &array1Ptr[index1];
  18.  
  19. //Трансформируем
  20. item1->x = item1->x * matrix1_M1.x + item1->y * matrix1_M2.x + item1->z * matrix1_M2.x + array1Position.x;
  21. item1->y = item1->x * matrix1_M1.y + item1->y * matrix1_M2.y + item1->z * matrix1_M2.y + array1Position.y;
  22. item1->z = item1->x * matrix1_M1.z + item1->y * matrix1_M2.z + item1->z * matrix1_M2.z + array1Position.z;
  23.  
  24. for (int index2 = 0; index2 < array2Count; index2++)
  25. {
  26. Vector3 *item2 = &array2Ptr[index2];
  27.  
  28. //Трансформируем
  29. item2->x = item2->x * matrix2_M1.x + item2->y * matrix2_M2.x + item2->z * matrix2_M2.x + array2Position.x;
  30. item2->y = item2->x * matrix2_M1.y + item2->y * matrix2_M2.y + item2->z * matrix2_M2.y + array2Position.y;
  31. item2->z = item2->x * matrix2_M1.z + item2->y * matrix2_M2.z + item2->z * matrix2_M2.z + array2Position.z;
  32.  
  33. //Проверка коллизии
  34. float num1 = item1->x - item2->x;
  35. float num2 = item1->y - item2->y;
  36. float num3 = item1->z - item2->z;
  37. if (sqrt(num1 * num1 + num2 * num2 + num3 * num3) < testSize)
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
Добавлено за 0.011 секунд, используя GeSHi 1.0.8.2


Вот применение:

Загрузить источник  GeSHi: C#
  1.  
  2. public bool IsCollision(Rigidbody3D sender)
  3. {
  4. BoundingSphere a = new BoundingSphere(_parent.CurrentNormalTransform.Translation, _parent.Size);
  5. BoundingSphere b = new BoundingSphere(sender._parent.CurrentNormalTransform.Translation, sender._parent.Size);
  6. if (a.Intersects(b))
  7. {
  8. Matrix matrix1 = _parent.CurrentNormalTransform.GetMatrix();
  9. Matrix matrix2 = _parent.CurrentNormalTransform.GetMatrix();
  10. Vector3 matrix1_M1 = new Vector3(matrix1.M11, matrix1.M12, matrix1.M13);
  11. Vector3 matrix1_M2 = new Vector3(matrix1.M21, matrix1.M22, matrix1.M23);
  12. Vector3 matrix1_M3 = new Vector3(matrix1.M31, matrix1.M32, matrix1.M33);
  13. Vector3 matrix2_M1 = new Vector3(matrix2.M11, matrix2.M12, matrix2.M13);
  14. Vector3 matrix2_M2 = new Vector3(matrix2.M11, matrix2.M12, matrix2.M13);
  15. Vector3 matrix2_M3 = new Vector3(matrix2.M11, matrix2.M12, matrix2.M13);
  16. return InternalHelper.IntersectsCollision(trs.PositionBuffer, sender.trs.PositionBuffer,
  17. _parent.CurrentNormalTransform.Translation, sender._parent.CurrentNormalTransform.Translation, 0.5f,
  18. trs.PositionBuffer.Length, sender.trs.PositionBuffer.Length,
  19. matrix1_M1, matrix1_M2, matrix1_M3, matrix2_M1, matrix2_M2, matrix2_M3);
  20. }
  21. return false;
  22. }
  23.  
Добавлено за 0.014 секунд, используя GeSHi 1.0.8.2


Результат эксперимента:
http://s5.uploads...
Работает быстрее шарпа в несколько раз, при условии, что MeshShape создается из низкополигонального варианта модели (на скрине низкополигональные варианты 5000 и 4000 точек, рисуются при этом нормальные модели). К тому же функцию можно еще оптимизировать
 
CSharpCraft
#14 Распечатать сообщение
Опубликовано 31.08.2013 14:18:23
Аватар пользователя

Специалист


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

Если кто то знает как можно еще оптимизировать алгоритм на C++, пожалуйста, напишите свою идею
 
HOMPAIN
#15 Распечатать сообщение
Опубликовано 31.08.2013 14:24:14
Старший специалист


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

А почему ты матрицу целиком не передаешь, а разбиваешь на вектора? Чтобы 3на3 только передать? Мне кажется лучше передавать всю.

В шарпе ты трансформацию делал через Vector3.Transform или вручную умножаешь на матрицу 3на3?
 
CSharpCraft
#16 Распечатать сообщение
Опубликовано 31.08.2013 14:37:45
Аватар пользователя

Специалист


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

HOMPAIN написал:
А почему ты матрицу целиком не передаешь, а разбиваешь на вектора? Чтобы 3на3 только передать? Мне кажется лучше передавать всю.

В шарпе ты трансформацию делал через Vector3.Transform или вручную умножаешь на матрицу 3на3?


Здесь я использую только часть матрицв, которая содержит масштабирование и повороты. Вектора я трансформирую вручную прямо в c++, а потом просто прибавляю смещение. Так быстрее. А класс матрицы сделать не проблема.
 
HOMPAIN
#17 Распечатать сообщение
Опубликовано 31.08.2013 14:49:15
Старший специалист


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

CSharpCraft написал:
Здесь я использую только часть матрицв, которая содержит масштабирование и повороты. Вектора я трансформирую вручную прямо в c++, а потом просто прибавляю смещение. Так быстрее. А класс матрицы сделать не проблема.


Это понятно. Просто такое дробление на вектора много операций занимает, мне кажется что быстрее передать всю матрицу, а лучше всего указатель на неё(Правда не уверен, что это возможно из шарпа).
 
CSharpCraft
#18 Распечатать сообщение
Опубликовано 31.08.2013 14:52:58
Аватар пользователя

Специалист


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

HOMPAIN написал:
CSharpCraft написал:
Здесь я использую только часть матрицв, которая содержит масштабирование и повороты. Вектора я трансформирую вручную прямо в c++, а потом просто прибавляю смещение. Так быстрее. А класс матрицы сделать не проблема.


Это понятно. Просто такое дробление на вектора много операций занимает, мне кажется что быстрее передать всю матрицу, а лучше всего указатель на неё(Правда не уверен, что это возможно из шарпа).


С этим я согласен. К тому же синтаксис попроще будет. С указателями надо поэксперементировать, к тому же понять как передается массив. Ведь в хна мы передаем массив структур, а сдесь уже используем класс Vector3. Или поменять его на структуру... вобщем будет видно
 
za5
#19 Распечатать сообщение
Опубликовано 31.08.2013 15:05:22
Старший специалист


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

в общем учите указатели, говорят даёт большой прирост в шарпе при работе с большими данными.
http://www.x-graph.ru/
http://www.cyberforum.ru/xna/
 
CSharpCraft
#20 Распечатать сообщение
Опубликовано 31.08.2013 15:17:41
Аватар пользователя

Специалист


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

za5 написал:
в общем учите указатели, говорят даёт большой прирост в шарпе при работе с большими данными.


Указатели, имелось ввиду, передача в C++.
При обращение к большому массиву прирост 900%. В алгоритме C++ я тоже использовал указатели. Вот алгоритм на C#,который я использовал до этого:

Загрузить источник  GeSHi: C#
  1.  
  2. fixed (Vector3* uPtr1 = &collection[0])
  3. fixed (Vector3* uPtr2 = &collection2[0])
  4. for(int index1 = 0; index1 < count1; index1++)
  5. for (int index2 = 0; index2 < count2; index2++)
  6. {
  7. Vector3* uVector1 = &uPtr1[index1];
  8. Vector3* uVector2 = &uPtr2[index1];
  9. float num1 = uVector1->X - uVector2->X + OFFSET->X;
  10. float num2 = uVector1->Y - uVector2->Y + OFFSET->Y;
  11. float num3 = uVector1->Z - uVector2->Z + OFFSET->Z;
  12. float num4 = num1 * num1 + num2 * num2 + num3 * num3;
  13. if (Math.Sqrt(num4) < testValue)
  14. return true;
  15. }
  16.  
Добавлено за 0.009 секунд, используя GeSHi 1.0.8.2


При этом C++ работает в два раза быстрее, да еще и применяет трансформации.
Изменил(а) CSharpCraft, 31.08.2013 15:23:51
 
Перейти на форум:
Vulkan клуб плагин.
Авторизация
Логин

Пароль



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

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

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,04 секунд 8,709,462 уникальных посетителей