Форум программистов, компьютерный форум, киберфорум
Java: GUI, Графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
1

Координаты от Vector3f в сторону Vector3f на расстоянии float

14.01.2021, 13:24. Показов 4017. Ответов 10

OpenGL, LWJGL 3.2.3 , Java
Есть два вектора и длина аля:
Java
1
2
3
Vector3f begin;
Vectro3f end;
float length
Нужно получить координаты точки(в Vector3f), если точка находится от begin на расстоянии length в сторону end. Подскажите как это вычислить? Спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2021, 13:24
Ответы с готовыми решениями:

Округление FLOAT в меньшую сторону
Всем привет. Такой вот вопрос! Как округлить Float в меньшую сторону void __fastcall...

Округление float числа в меньшую сторону с двумя знаками
Привет! Есть числа вида 8,8889324. Как имея подобное число вывести 8,88 ? Функции round или...

Случайные координаты на заданном расстоянии от точки
Есть некое 3х мерное пространство, обусловленное координатами X Y Z. Есть координатная точка:...

Найти координаты точек, находящихся на максимальном расстоянии
program record5;{найти координаты точек, находящихся на максимальном расстоянии}; type Coord...

10
Модератор
1504 / 488 / 162
Регистрация: 11.08.2017
Сообщений: 1,645
14.01.2021, 13:41 2
Лучший ответ Сообщение было отмечено EugeneV как решение

Решение

EugeneV,

Не по теме:

Тема к opengl отношения не имеет, тут чистая геометрия


по идее как-то так
Java
1
2
3
4
5
6
7
8
9
10
11
Vector3f begin = new Vector3f(0.0f, 0.0f, 0.0f);
Vector3f end = new Vector3f(5.0f, 0.0f, 0.0f);
float length = 1.0f;
Vector3f vec = new Vector3f();
end.sub(begin, vec); //находим координаты вектора, конец минус начало
vec.normalize(); // нормализуем, так как важно только направление
vec.mul(length); // умножаем на нужную длинну
vec.add(begin); // прибавляем координаты начала
System.out.println(begin);
System.out.println(end);
System.out.println(vec);
0
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
14.01.2021, 15:51  [ТС] 3
Java
1
2
end.sub(begin, vec); //находим координаты вектора, конец минус начало
vec.normalize();// нормализуем, так как важно только направление
Если теперь я хочу новую точку(построенную до этого относительно Begin) переместить в полученное направление то что что я должен сделать с
Java
1
Vector3f newPoint = new Vector3f(begin.x + 10,begin.y + 10,begin.z);
?

Добавлено через 1 минуту
Пока изучаю данные вопросы. Не понимаю просто что делает normalize.

Добавлено через 32 минуты
И еще вопрос где в LWJGL 3.2.3 элементы аля цилиндр и т.п.?
0
Модератор
1504 / 488 / 162
Регистрация: 11.08.2017
Сообщений: 1,645
14.01.2021, 16:15 4
Цитата Сообщение от EugeneV Посмотреть сообщение
что делает normalize
нормализует нормаль, делает чтобы длин вектора была равна 1, то есть делит каждую координату на длину вектора

Цитата Сообщение от EugeneV Посмотреть сообщение
элементы аля цилиндр и т.п.?
у него как часть есть вот эта библиотека, там параметрические фигуры
XML
1
2
3
4
5
<dependency>
    <groupId>org.lwjgl</groupId>
    <artifactId>lwjgl-par</artifactId>
    <version>3.2.3</version>
</dependency>
Добавлено через 29 секунд
Цитата Сообщение от EugeneV Посмотреть сообщение
Если теперь я хочу новую точку(построенную до этого относительно Begin) переместить в полученное направление то что что я должен сделать с
не понял...
0
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
14.01.2021, 16:52  [ТС] 5
Задам новый вопрос взамен старого. Конечный результат это цилиндр.
1.Я строю круг по точкам вокруг "Vector3f begin".
Java
1
2
3
4
5
6
7
Vector3f begin = ...
double x = begin.x + radius * Math.cos(angle);
double y = begin.y + radius * Math.sin(angle);
double z = begin.z;
Vector3d point = new Vector3d(x,y,z);
...
Vector3d[] points ...
points это массив точек круга вокруг центра begin
То есть грубо говоря вокруг(вдоль) оси z.

2. У меня также есть Vector3f direction (направление). Я хочу повернуть все края своего круга в сторону направления, при этом центр begin остается на месте(центр поворота). Как это сделать?

Добавлено через 2 минуты
Мысль в том, что изучение lwjgl-par займет время. Я уже хочу лепить 3д деталюшки из простых примитивных объектов.
0
Модератор
1504 / 488 / 162
Регистрация: 11.08.2017
Сообщений: 1,645
14.01.2021, 16:58 6
EugeneV,

Не по теме:

вообще новый вопрос, новая тема


если рисуете на opengl, то просто создайте матрицу модели и в шейдерах умножайте на нее
нечто такое как основа для изучения
Java
1
2
Matrix4f model = new Matrix4f();
model.lookAt(begin, direction, up);
можно и до отрисовки умножить
Java
1
2
Vector4f p = new Vector4f(point.x, point.y, point.z, 0);
p.mul(model);
вектор up это вектор направления вверх, по идее можно поставить (0,1,0) если ось Y вверх
4 координата в 0 чтобы не перемещать, гомогенные координаты в помощь
0
Модератор
1504 / 488 / 162
Регистрация: 11.08.2017
Сообщений: 1,645
15.01.2021, 00:05 7
Лучший ответ Сообщение было отмечено EugeneV как решение

Решение

Цитата Сообщение от EugeneV Посмотреть сообщение
изучение lwjgl-par займет время
5 минут времени и использование примеров с сайта по ссылке
Java
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
import static org.lwjgl.util.par.ParShapes.*;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
 
import org.lwjgl.util.par.ParShapesMesh;
 
public class Test {
    
    public static void main(String[] args) {
        new Test().run();
    }
 
    private void run() {
        ParShapesMesh cylinder = par_shapes_create_cylinder(30, 3); //создание примитива
        //получение данных
        int np = cylinder.npoints();
        FloatBuffer points = cylinder.points(np); //вершины
        int nt = cylinder.ntriangles();
        IntBuffer triangles = cylinder.triangles(nt); // индексы
        FloatBuffer normals = cylinder.normals(np); // нормали
        par_shapes_rotate(cylinder, 1.57f, new float[]{1, 0, 0}); //вращение вокруг оси x на 1.57 радиана
        par_shapes_translate(cylinder, 0, 0, 3); // премещение на 3 вдоль оси z
        //повторить получение данных
    }
}
FloatBuffer и Intbuffer без проблем скармливаются opengl через lwjgl, а вот в джаву вытащить данные из них немного проблемнее
1
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
15.01.2021, 09:42  [ТС] 8
Спасибо огромное, это вообще шикарно и просто

Добавлено через 1 минуту
А текстурные координаты в нем никак не получить?

Добавлено через 33 минуты
Затупил, сам нашел

Добавлено через 26 минут
Беда в том что на цилиндр не ложатся текстуры, он черный и частично не отрисовывается(
0
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
15.01.2021, 09:48  [ТС] 9
Поправил, текстуры ложатся, но фигура кривая все равно, чего делать?
0
Миниатюры
Координаты от Vector3f в сторону Vector3f на расстоянии float  
-12 / 1 / 0
Регистрация: 11.02.2017
Сообщений: 232
15.01.2021, 10:07  [ТС] 10
ParShapes.par_shapes_create_cylinder(6, 10);

Добавлено через 18 минут
Какой должен стоять DrawMode?
0
Модератор
1504 / 488 / 162
Регистрация: 11.08.2017
Сообщений: 1,645
15.01.2021, 11:47 11
EugeneV, я поохже немного ошибся в коде, там надо числа полученные умножать на 3, так как там это число вершин и треугольников, то есть каждый элемент состоит из 3 частей
Java
1
2
3
4
5
6
7
ParShapesMesh cube = par_shapes_create_cube();
int np = 3 * cube.npoints();
FloatBuffer points = cube.points(np);
int nt = 3 * cube.ntriangles();
IntBuffer triangles = cube.triangles(nt);
FloatBuffer normals = cube.normals(np);
FloatBuffer texture = cube.tcoords(np);
И у куба есть приписка Generates points for a cube that fits in the unit sphere. Texture coordinates and normals are not generated.
Для генерации нормалей надо добавить
Java
1
2
3
ParShapesMesh cube = par_shapes_create_cube(); //создание примитива
par_shapes_unweld(cube, true);
par_shapes_compute_normals(cube);
Тогда смысл индексов теряется и еще я заметил что после например поворота примитива буферы сами обновляются
Текстуры хоть получить и можно но это такое дело, что генерировать развертку процедурно не тривиальная задачка и для сложных форм надо делать руками

Добавлено через 3 минуты
У цилиндра есть и текстуры и нормали. Для текстур np надо умножать на 2, в ide у этой библиотеки есть документация, разобраться можно, там написано если где то не будет нормалей и текстур
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2021, 11:47

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Координаты точки, находящейся на заданном расстоянии от отрезка
Доброго времени суток, форумчане. Имеется отрезок AB. Необходимо найти координаты точки D,...

Найти координаты точки на отрезке при известном расстоянии до неё
Есть отрезок с известными координатами начала и конца, допустим А(х1, у1) и B(x2, y2). Как найти...

Найти координаты точки, которая отстоит от всех заданных точек на минимальном расстоянии
В плоском зале установлено множество точек доступа (больше 2). Необходимо найти координаты точки в...

Наити наибольшую сторону треугольника, если заданы координаты вершин
Составить программу, которая находит наибольшее сторону треугольника, если заданы координаты...

Найти наименьшую сторону треугольника, если заданы координаты вершин
Добрый вечер! у меня возникла проблема при выполнении функции нахождения минимума, пишет, что...

Известны координаты вершин треугольника A,B,C. Из вершины В на сторону АС опущена высота BD;
из вершины А проведена медиана АЕ на сторону ВС. A(4;6) B(0;6) C(-6;-6). 1.Составьте уравнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.