Войти
ПрограммированиеФорумОбщее

Произвольный перпендикуляр к 3D-вектору (3 стр)

Страницы: 1 2 3
#30
(Правка: 11 апр. 2019, 0:30) 23:45, 10 апр. 2019

А вот ещё вариант, самый простой и тупой, наверно:

float3 GetArbitraryPerpendicular(in float3 v)
{
    return math.normalizesafe(new float3(v.z, 0, -v.x), new float3(1, 0, 0));
}
+ Показать

Причём все вектора в горизонтальной плоскости. Может быть, для чего-нибудь это полезно.


#31
(Правка: 11:18) 1:47, 13 апр. 2019

alexzzzz
надо откидывать самую малую координату и считать cross с соотв-й осью, через ветвление

alexzzzz
> new float3
ужос, как вы с этим живете

#32
19:33, 13 апр. 2019

Aslan
> ужос, как вы с этим живете
Это не С++.

#33
(Правка: 19:41) 19:41, 13 апр. 2019

Aslan
> откидывать самую малую координату и считать cross с соотв-й осью, через ветвление
Уже давно предложено практически это, причём без ветвления.

#34
(Правка: 21:32) 21:06, 13 апр. 2019
float3 GetArbitraryPerpendicular(in float3 v)
{
    return math.normalizesafe(new float3(v.z, 0, -v.x), new float3(1, 0, 0));
}
Преобразовать массив из 1000 случайных векторов 1000 раз занимает 6,7 мс. Ветвление в дизассме есть.
float3 GetArbitraryPerpendicular(in float3 v)
{
    float x = (math.abs(v.y) > math.abs(v.x)) ? 1f : 0f;
    return math.normalize(math.cross(v, new float3(x, 1 - x, 0)));
}
Преобразовать массив из 1000 случайных векторов 1000 раз занимает 7,2 мс. Ветвления нет.


PS

float3 GetArbitraryPerpendicular(in float3 v)
{
    return (math.abs(v.y) < 0.99) ? new float3(-v.z, 0, v.x) : new float3(0, v.z, -v.y);
}
Так быстрее ― 2,5 мс, но результат ненормализован. Ветвление есть.
С дополнительной нормализацией не отличается от первого варианта ― 6,7 мс.

#35
23:34, 13 апр. 2019

Mikle
> Уже давно предложено практически это, причём без ветвления
Да, видел. Кстати добавь abs

float x = (float)(fabs(v.y) > fabs(v.x));
#36
8:29, 14 апр. 2019

Aslan
> Кстати добавь abs
alexzzzz добавил дальше.

Прошло более 6 месяцев
#37
(Правка: 11:40) 11:25, 6 ноя. 2019

Оптимизировал еще дальше. Фрагмент из ATA Lib:

vec3 ort() const {
        int a=(y>x);
        vec3 v(0,0,(&x)[a]);v[a]=-z; // 0: (-z,0,x)   1: (0,-z,y)
        return v;
}

#38
(Правка: 17:29) 16:03, 6 ноя. 2019

Aslan
Это надо переводить на регистры, а у регистров нет позиционных индексов. Поэтому такой вариант может быть таким же производительным в сравнении с предыдущими реализациями.

если это с/c++ код я бы писал так

vec3 ort(vec3 in)
{
  float x = in.x;
  float y = in.y;
  bool a = (abs(y)>abs(x));
  vec3 v(0,0,a?y:x);
  if (a) v.y = -in.z; else v.x = -in.z;
  return v;
}

Страницы: 1 2 3
ПрограммированиеФорумОбщее