forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Оптимальный способ проверить находится ли объект между точками знаете? (http://forum.boolean.name/showthread.php?t=15868)

CRASHER 17.11.2011 22:15

Оптимальный способ проверить находится ли объект между точками знаете?
 
Вопрос в оглавлении. Я вот пользуюсь xLinePick. Сейчас надо делать до 100 таких проверок за проход.Это медленно. Есть альтернатива этой команде?

Reizel 18.11.2011 00:46

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
гугли "расстояние от точки до прямой". Если не понимаешь, зачем это - лучше продолжай делай пиками :D

dsd 18.11.2011 02:41

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Векторы?

1.Вектор соединяющий точки. Вектор от точки до объекта. Считаешь их длины.

Косинус угла между векторами (x1*x2+y1*y2+z1*z2)/(|длина первого|*|длина второго|). Чем ближе значение к единице тем ближе позиция объекта к линии соединяющей точки. При единице лежит на линии.


2. Вектор от первой точки к второй назовем а. От первой точки к объекту б.

если координата икс у обоих одного знака и у б она меньше по модулю, то если отношение координат этих векторов равно, то объект лежит между точек.

Одинаковый знак если произведение координат больше равно нуля.

if ((a.x*b.x>=0) && (b.x/a.x==b.y/a.y && b.x/a.x=b.z/a.z)) { ... }

CRASHER 18.11.2011 16:24

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Reizel, как это можно использовать при нахождении объекта?

CRASHER 18.11.2011 16:27

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
dsd, а как провести вектор от точки до объекта, который как раз между точками? Получется надо строить кучу векторов от точки до каждого объекта сцены, так?

dsd 18.11.2011 16:49

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Цитата:

Сообщение от CRASHER (Сообщение 210229)
dsd, а как провести вектор от точки до объекта, который как раз между точками? Получется надо строить кучу векторов от точки до каждого объекта сцены, так?

В своей голове ты его проводишь. В уме. :facepalm:

pozitiffcat 18.11.2011 16:51

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Может xLinePick(xyz откуда, xyz до куда) вернет entity

FireOwl 18.11.2011 16:55

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Если вычислять расстоянием от прямой до точки, то все потенциальные объекты нужно перебрать, очевидно.

pozitiffcat 18.11.2011 16:59

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
стремно нету маски например по entitytype
UPD не ну пусть делает по такому алгоритму
пустить луч, если он что то нашел, если это искомый объект - то да он находится между, если это другой объект, то пустить луч еще раз только уже от этого другого, и так до тех пор пока искомый объект не найдется, если в итоге он вернул ноль то ниче не нашел

CRASHER 18.11.2011 17:30

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Не понимаю о чем зашел разговор. Я LinePick'ом и пользуюсь, мне просто интерестно есть ли что то быстрее этого? Мож в ксорсе что то по быстрее есть, или библиотеки какие новые появились.
dsd, ты наверно в голове и код игры пишешь и публикуешь в голове и ганарары тоже в голове получаешь?)) Не ну серьёзно, не пойму ударов по твоему лицу ладоней.

pozitiffcat 18.11.2011 17:39

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
а с чего ты взял что медленно? Быстрее RayCastинга вроде нет ниче.. да и небывает наверное.

Платон Александрович 18.11.2011 18:01

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
CRASHER
Подозреваю что xLinePick, как впрочем и весь рейтрейсинг в хорсе, перебирает все ентити в сцене, поэтому не так быстро как тебе хочется. Используй физический движок (кажется там встроен Bullet), либо почитай про space partitioning (Sweep & Prune, BVH, Octree, BSP, KD-Tree и подобное) и сделай сам :) Выбор метода зависит от сцены, динамическая она или статическая, и какие в ней объекты.

pozitiffcat 18.11.2011 19:49

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
физика там есть тока вот не риализовано там на основе физики вся эта лабуда. Как вариант пилить самому физ движок под ксорс

CRASHER 18.11.2011 19:53

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
pozitiffcat, а во вспомнил RayCast точно, вроде оно.

.Squid 18.11.2011 20:51

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Цитата:

Сообщение от pozitiffcat (Сообщение 210246)
физика там есть тока вот не риализовано там на основе физики вся эта лабуда. Как вариант пилить самому физ движок под ксорс

Ваша уверенность, сударь, вызывает у меня недоумение и утомление.
Физика в Ксорсе основана на Буллите. А тот использует и BVH, и sweep and prune, и что-то еще, инфа 100%.
Последнее предложение вообще на грани фантастики.

Reizel 18.11.2011 21:01

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Ха, доставило. Тема:
Оптимальный способ проверить находится ли объект между точками знаете?

Сказал же, сходи погугли расстояние от точки до прямой. прямая задается простейшим уравнением. Объект представим точкой и диаметром - из этого можно посчитать расстояние от центра до линии, образованной этими вашими двумя точками. А там уже условием отсекать лишнее г-но.

Учите матан. Движок собрались писать физический. *facepalm*

pozitiffcat 18.11.2011 21:09

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Не ну где тогда реализованая функция RayCast в физике. Я не дурак. И в курсе что на буллете основано. Я тоже могу запиилть двиг и присобачить к нему буллет (образно), но это не значит, что я вынесу все функции буллета в свою ддл. Так и у тебя. Оно там есть, но не реализовано в твоей длл!

pozitiffcat 18.11.2011 21:11

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Цитата:

Как вариант пилить самому физ движок под ксорс
Имелл ввиду врапить готовый физ двиг. Для непонятливых

.Squid 18.11.2011 22:07

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
docs/html/group__px__raycast.html
BBDECL int BBCALL xPhysicsCountHits ()
Returns the number of hits of the last raycast.
BBDECL float BBCALL xPhysicsGetHitDistance (int index=0)
Returns the distance to the hit point from the ray's start.
BBDECL Entity *BBCALL xPhysicsGetHitEntity (int index=0)
Returns a handle of an entity which was hit by the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalX (int index=0)
Returns the X component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalY (int index=0)
Returns the Y component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalZ (int index=0)
Returns the Z component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointX (int index=0)
Returns global X coordinate of the hit point of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointY (int index=0)
Returns global Y coordinate of the hit point of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointZ (int index=0)
Returns global Z coordinate of the hit point of the last raycast.
BBDECL void BBCALL xPhysicsRayCast (float fromX, float fromY, float fromZ, float toX, float toY, float toZ, int rcType=0, int rayGroup=0)
Cast a ray trough the scene and gathers the detailed information on what was hit.

FireOwl 18.11.2011 23:00

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Беседа тут какая-то... фантастическая.
Кстати, правильнее будет не "вопрос в оглавлении", а "вопрос в заголовке".
Ладно я пошел, пока не заразился.

pozitiffcat 18.11.2011 23:58

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Цитата:

Сообщение от .Squid (Сообщение 210260)
docs/html/group__px__raycast.html
BBDECL int BBCALL xPhysicsCountHits ()
Returns the number of hits of the last raycast.
BBDECL float BBCALL xPhysicsGetHitDistance (int index=0)
Returns the distance to the hit point from the ray's start.
BBDECL Entity *BBCALL xPhysicsGetHitEntity (int index=0)
Returns a handle of an entity which was hit by the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalX (int index=0)
Returns the X component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalY (int index=0)
Returns the Y component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitNormalZ (int index=0)
Returns the Z component of the hit normal of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointX (int index=0)
Returns global X coordinate of the hit point of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointY (int index=0)
Returns global Y coordinate of the hit point of the last raycast.
BBDECL float BBCALL xPhysicsGetHitPointZ (int index=0)
Returns global Z coordinate of the hit point of the last raycast.
BBDECL void BBCALL xPhysicsRayCast (float fromX, float fromY, float fromZ, float toX, float toY, float toZ, int rcType=0, int rayGroup=0)
Cast a ray trough the scene and gathers the detailed information on what was hit.

ой вот я облажался!!! я же реализовывал это в своем враппере

CRASHER 19.11.2011 00:09

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
FireOwl,Да какая разница заголовок оглавление.

Reizel, вот ненавижу тут вопросы задавать, обязательно учить будут, но помоч может только умный. Пост первый надо внимательнее прочитать. Я не стал вписывать в ЗАГОЛОВОК LinePick термин. И хотел узнать в конечном счете ему альтернативу. Формулу пор точку ч прямой, я и так использую постоянно. А вот pozitiffcat помог, вспомнил про рейкаст. Я помню с физикса что была какая то система. Но визуально найти не смог. Вот теперь буду рейкасты мучить.

FireOwl 19.11.2011 00:23

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Совсем никакой. Просто пришлось остановить взгляд на фразе и подумать, что она означает. Это полезно.
А оглавление - список заголовков. :-)

CRASHER 19.11.2011 03:35

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
FireOwl, оглавление может содержать и один заголовок. Тем самым он приравнивается к нему.

FireOwl 19.11.2011 05:20

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Я бы с этим поспорил, но не вижу смысла. :)

shybovycha 19.11.2011 12:43

Ответ: Оптимальный способ проверить находится ли объект между точками знаете?
 
Доброго времени суток, уважаемый ТС!

Попробуйте старый проверенный способ (действует лишь при наличии трех точек): коль даны точки А и В, а объект находится в точке С, логично соединить точки тремя отрезками и получить треугольник. А потом уже вступает в дело "точность" - если вам необходимо, чтобы объект находился точно на отрезке АВ - задайте некую delta = 0, коль "точность" нужна поменьше - задайте delta = AABB.diag (какое-нибудь расстояние в пределах ААВВ объекта, например - длинна отрезка от левого нижнего спереди до правого верхнего угла сзади ААВВ). И вот когда у вас будет три отрезка - АВ, АС, ВС и delta - можете сделать следующую проверку:

if (AC + BC <= AC + delta)
// объект между точками


Здесь, АС, ВС и АС - числа, представляющие длинну соответствующего отрезка. Насколько мне известно, работать будет довольно шустро.


Часовой пояс GMT +4, время: 10:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot