• Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Наконец то добрался до политена, все разобрался, все оказалось намного проще.
    Как бы объяснить, попытка применения матрицы плавно трансформировалась в направления векторов, из полученных векторов: вектор направления, вектор вверх и вбок. Из них получилось некое подобие матрицы. Отлично работает!

    Александр Павлюк Александр Павлюк Огромное спасибо за ответ. Вообще впервые вижу подробный ответ.
    Спасибо за матрицу, хоть и не пришлось её применить, но я с ней обязательно поэксперементирую, такое обязательно нужно использовать.

    Здесь у меня видео с результатом того, что я и хотел получить.
    Цилиндрическая винтовая линия
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Может быть как то систему координат сменить?
    Что бы ни делал - бесполезно, линия, как баран, только в одном направлении идет
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Попробовал просто подставить ф-ю поворота для каждой точки(на лету)
    Получилось х. пойми что, какой-то волосатый коронавирус.
    Желтая линия - непосредственно сама спираль, синие линии - это точки после поворота.
    5f21384881316675568337.jpeg
    Самое плохое - линия так же, в одном направлении.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Александр Павлюк,
    То-есть, если я правильно понял:
    нужно все точки уже нарисованной линии сохранить в массив(при рисовании)?
    потом поворачивать матрицей этот массив точек?

    Сейчас мне этот момент не понятен.
    Это нужно будет использовать
    newx = a*x + b*y + c*z
    newy = d*x + e*y + f*z
    newz = g*x + h*y + i*z

    Как мне использовать массив точек для поворота?
    В цикле все перемножать?
    Я опять запутался.
    Сегодня не попал в политен, уехал он, до след. недели не будет, а у меня масса вопросов.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    А. Понятно.
    Т.е. если понятнее, для примера я нарисовал рисунок(обычный рисунок), потом, с помощью матрицы эту картинку поверну в направлении нужного мне вектора.
    Сейчас вроде понятно. Сначала рисую, потом поворачиваю.
    Ну да, тогда конечно, зачем цикл. Уже что-то проблескивает.

    Во у меня "глаз замылился".
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Может быть я неправильно вызываю фу-ю
    Matrix3D(x, y, pos2, direction, new_pos);

    Matrix3D(const float Sin, const float Cos, float Pos[3], float VecRotate[3], float NewPos[3]){

    Я предполагаю что VecRotate это есть вектор, вдоль которого и будет происходить вращение, NewPos обновлённые координаты точек для рисования.
    В среду в политен, чувствую у меня вопросов добавилась, просто оОгромная куча.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Тогда вот этот момент мне не понятен.
    А как тогда нарисовать линию без обновления точек? Может быть нужно точки записывать в массив, потом по ним рисовать? Хотя то-же самое и получится, в принципе.
    Вообще запутался.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Видимо я что-то не так понял. Заинтересовало.

    А как тогда поворачивать на угол? Вернее как получить новые точки для отрисовки линии.
    Я это делал в цикле, изначальное значение счетчика = 0, потом +какое-то значение PI к счетчику(счетчик это, в принципе, есть угол), пока не будет 2*PI(полная окружность).
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Нет, неправильно.
    Эту матрицу нужно сделать отдельной функцией, и подключать её при запуске функции создания самой линии. Формула поворота внутри ф-ции создания линии.
    Как только запустится формула поворота - так запускаю матрицу. Вернее формула поворота запускает матрицу.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Если я правильно понял. сама матрица в функции представится вот так:

    stock GreateSpiral(float StartPos[3], float EndPos[3], float angles[3], float radius) {
    
    	float Cos, Sin;
    	Cos = Cosine(degree);    //  degree угол на коорый поворачиваю(в радианы наверно нужно перевести)
    	Sin = Sine(degree);
    
    	vx = angles[0];
    	vy = angles[1];
    	vz = angles[2];
    
    	while(degree <= PI * t) {
            float a = Cos + (1 - Cos) * vx * vx;
    		float b = (1 - Cos)) * vx * vy - Sin * vz;
            float c = (1 - Cos) * vx * vz + Sin * vy;
            float d = (1 - Cos) * vy * vx + Sin * vz;
            float e = Cos + (1 - Cos) * vy * vy;
            float f = (1 - Cos) * vy * vz - Sin * vx;
            float g = (1 - Cos) * vz * vx - Sin * vy;
            float h = (a - Cos) * vz * vy + Sin * vx;
            float i = Cos + (1 - Cos) * vz * vz;
            ......
            ......
            ......
            Здесь отрисовка линии......
            
            degree += PI/10.0;
        }
    }
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    По большому счету, можно сделать из этого кода некое подобие библиотеки, что бы на будущее использовать там где нужно(а у меня такого использования валом)
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Так это и есть матрица!?
    Я как раз в наш политен собирался в среду идти за помощью к знакомым математикам, может быть сам разберусь. Ты не преподаватель случайно?

    Кстати, это твой проект ГЕРОИ КОРОНЫ И ВИРУСА: Заражение Эрэфии?
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Записать в таком виде?
    float a=cos(a)+(1-cos(a))*vx*vx;
    float b=(1-cos(a))*vx*vy-sin(a)*vz;
    float c=(1-cos(a))*vx*vz+sin(a)*vy;
    float d=(1-cos(a))*vy*vx+sin(a)*vz;
    float e=cos(a)+(1-cos(a))*vy*vy;
    float f=(1-cos(a))*vy*vz-sin(a)*vx;
    float g=(1-cos(a))*vz*vx-sin(a)*vy;
    float h=(a-cos(a))*vz*vy+sin(a)*vx;
    float i=cos(a)+(1-cos(a))*vz*vz;
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    {
    {cos(a)+(1-cos(a))*vx*vx, (1-cos(a))*vx*vy-sin(a)*vz, (1-cos(a))*vx*vz+sin(a)*vy, 0},
    {(1-cos(a))*vy*vx+sin(a)*vz, cos(a)+(1-cos(a))*vy*vy, (1-cos(a))*vy*vz-sin(a)*vx, 0},
    {(1-cos(a))*vz*vx-sin(a)*vy, (a-cos(a))*vz*vy+sin(a)*vx, cos(a)+(1-cos(a))*vz*vz, 0},
    {0, 0, 0, 1}
    }


    Такая форма записи как то понятнее, но за мудренее - можно ошибиться при записи. Дальнейшее не совсем понятно, не понятно как записать.
    Вообще, огромное спасибо, впервые встречаю такой достойный ответ и хоть пока не совсем понятное (но уже какой то просвет появился) объяснение.
    На юнити (C#) для этой цели есть готовые библиотеки, ими просто пользуешься и не приходится ломать голову.
    Здесь же приходится вот так изгаляться, какие-то "углы Эйлера" изобретать. Сейчас уже есть над чем подумать. Если получится - будешь моим кумиром.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    матрицу довольно просто самому расписать.
    Достаточно посмотреть что класть в ячейки матрицы поворота.


    Я не представляю как это сделать, да еще на этом языке.
    не пойму почему нельзя сделать это без матриц. Углы поворота есть, направление есть, вроде есть всё. Осталось это всё направить по вектору направления.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Двигаешь по оси Z. А направление как сменить? Как привязать все эти точки к вектору направления? В каком направлении ось Z?
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Матрица это хорошо, но не в каждом языке есть она, расписанная.
    Что бы с матрицей работать, нужно сначала её как-то расписать. Для этого нужно, как минимум, понять как она работает. В этом языке нет таких библиотек. Все своими ручками. Скриптовый язык. Pawn, шустрый, понятный, но сильно урезанный.
    По идее, конечно матрицей было бы лучше и проще, так как радиус рисуется по плоскости которая повернута перпендикулярно к направляющему вектору.
  • Как создать цилиндрическую винтовую линию?

    @tonline_kms65 Автор вопроса
    Забыл указать - без любого вида матриц.
    Есть вектор направления, есть стартовая позиция(точка), есть конечная позиция(точка)