Мы используем файлы cookie, чтобы упростить навигацию на этом сайте. Если вы даете свое согласие на использование файлов cookie и обработку ваших персональных данных, нажмите «Принимаю».

Создание цилиндра с точными координатами

Домой Форумы Для программистов Создание цилиндра с точными координатами

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Автор
    Сообщения
  • #18420
    xfish3
    Участник

    Добрый день!
    Был бы очень признателен за подсказку, как в Вердже отрисовать цилиндр между произвольными координатами.
    Суть возникшей задачи в том, что есть координаты начала и конца палки (отрисую через цилиндр), которые могут произвольно изменяться. И между ними нужно отрисовать эту палку.
    Заранее большое спасибо!

    #18421
    kdv
    Участник

    цилиндрическая геометрия не рисуется между двумя точками. Тут алгоритм немного замысловатый ))) нужно создать обычный цилиндр метровой высоты (https://www.soft8soft.com/docs/api/en/geometries/CylinderGeometry.html). потом поместить его в первую точку, задать масштаб по Y равный расстоянию между точками (в метрах), получить направление от одной точки к другой и развернуть цилиндр в данном направлении.

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18423
    xfish3
    Участник

    Понял. Спасибо огромное! :good:

    #18424
    kdv
    Участник

    должно получиться примерно так https://v3d.net/fk3 B-)

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18426
    xfish3
    Участник

    Попробовал сделать через создание цилиндра единичной высоты, центр фигуры поставил в основание и подключил морфинг.
    В вердже определяю расстояние между двумя точками и пробую поворачивать цилиндр.
    Все работает нормально, кроме последнего пункта – сложновато осуществляется расчёт поворота через тригонометрические функции.
    Нет ли встроенной функции (пазла), позволяющей рассчитать на какой угол нужно повернуть объекта как вектор по x, y и z относительно текущего положения?

    #18428
    kdv
    Участник

    функции есть практически на все случаи, паззлы для манипуляции с векторами тоже есть, но с ними работать муторно и результ не всегда гарантирован. прооще загуглить и нарисовать пару-тройку строк кода…

    const zeroVector = new v3d.Vector3();
    const upVector = new v3d.Vector3(0, 1, 0);
    const direction = zeroVector.subVectors(pointTwo, pointOne).normalize();
    const quaternion = new v3d.Quaternion().setFromUnitVectors(upVector, direction);
    cylinder.rotation.setFromQuaternion(quaternion);

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18429
    kdv
    Участник

    Но если очень хочется именно паззлами, то можно так поворот замутить

    https://v3d.net/fk3

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18437
    xfish3
    Участник

    Я прошу прощения, но не получается манипулировать объектом в сцене.
    Название цилиндра у меня: clndr
    Передаю из сцены информацию о положении двух точек, далее сделал как сказали:

    app.ExternalInterface.myJSFunction = function(pt1, pt2) {
            console.log('x1: ' + pt1[0] + ', y1: ' + pt1[1] + ', z1: ' + pt1[2]);
            console.log('x2: ' + pt2[0] + ', y2: ' + pt2[1] + ', z2: ' + pt2[2]);
    	const pointOne  = new v3d.Vector3(pt1[0], pt1[1], pt1[2]);
    	const pointTwo  = new v3d.Vector3(pt2[0], pt2[1], pt2[2]);
    	const zeroVector = new v3d.Vector3();
    	const upVector = new v3d.Vector3(0, 1, 0);
    	const direction = zeroVector.subVectors(pointTwo, pointOne).normalize();
    	const quaternion = new v3d.Quaternion().setFromUnitVectors(upVector, direction);
    	clndr.rotation.setFromQuaternion(quaternion);
    }

    Но в консоли выдается ошибка:
    Uncaught ReferenceError: clndr is not defined

    Пробовал писать v3d.scene.clndr.rotation.setFromQuaternion(quaternion) – тоже не помогает.
    Подскажите пожалуйста, в чем я ошибаюсь?

    #18440
    xfish3
    Участник

    Я извиняюсь, но не получается управлять объектом в сцене.
    Я передал координаты точек, а далее как сказали:

    app.ExternalInterface.myJSFunction = function(pt1, pt2) {
    	console.log('x1: ' + pt1[0] + ', y1: ' + pt1[1] + ', z1: ' + pt1[2]);
    	console.log('x2: ' + pt2[0] + ', y2: ' + pt2[1] + ', z2: ' + pt2[2]);
    	const pointOne  = new v3d.Vector3(pt1[0], pt1[1], pt1[2]);
    	const pointTwo  = new v3d.Vector3(pt2[0], pt2[1], pt2[2]);
    	const zeroVector = new v3d.Vector3();
    	const upVector = new v3d.Vector3(0, 1, 0);
    	const direction = zeroVector.subVectors(pointTwo, pointOne).normalize();
    	const quaternion = new v3d.Quaternion().setFromUnitVectors(upVector, direction);
    	clndr.rotation.setFromQuaternion(quaternion);
    }

    Но в консоли выдается ошибка: Uncaught ReferenceError: clndr is not defined
    Пробовал писать v3d.scene.clndr.rotation.setFromQuaternion(quaternion) – тоже не помогает.

    Подскажите пожалуйста, где я ошибаюсь?

    #18442
    kdv
    Участник

    ну, правильно выдает ))) внутри функции clndr не декларирован. А переменную в паззлах эта функция не увидит. если только как VARS.clndr. Кроме того, clndr – это имя цилиндра или сам цилиндр? если это таки имя цилиндра, заданное в паззлах при его создании, то добавь стоку кода перед поворотом
    const clndr = app.scene.getObjectByName('clndr');

    Кроме того, если координаты точек pt1 и pt2 передавались из паззлов через паззлу вектор, то там они в формате XYZ и для использования в коде нужна конвертация, иначе это будет совсем не та точка, которая планировалась
    const pointOne = new v3d.Vector3(pt1[0], pt1[2], -pt1[1]);

    И зачем так сложно, через app.ExternalInterface.myJSFunction? Код можно и в паззлах писать, внутри паззлы execscript.

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18446
    xfish3
    Участник

    Спасибо огромное! Получилось! :good:
    В текущем варианте в принципе работает, но был бы очень благодарен за совет как оптимизировать код через execscript. Не понимаю как красиво передать параметры начальной и конечной точки. А делать через присваивание (x, y, z) каждой точки – будет выглядеть колхозно как мне кажется.
    И как через JavaScript установить позицию? Попробовал написать
    clndr.position.set(pointOne); – цилиндр улетает за пределы видимости камеры.
    Может быть и морфинг тоже через вызов в execscript можно будет сделать?

    Мой код поворота цилиндра:

    
    app.ExternalInterface.myJSFunction = function(pt1, pt2) {
    	const pointOne  = new v3d.Vector3(pt1[0], pt1[2], -pt1[1]);
    	const pointTwo  = new v3d.Vector3(pt2[0], pt2[2], -pt2[1]);
    	const zeroVector = new v3d.Vector3();
    	const upVector = new v3d.Vector3(0, 1, 0);
    	const direction = zeroVector.subVectors(pointTwo, pointOne).normalize();
    	const quaternion = new v3d.Quaternion().setFromUnitVectors(upVector, direction);
    	const clndr = app.scene.getObjectByName('clndr');
    	clndr.rotation.setFromQuaternion(quaternion);
    }
    

    Я правда не до конца понял, как работает, но работает. Почитаю еще “Developer Reference”.
    Паззлы перемещения+морфинга+вызова внешней функции:

    Вложения:
    Вы должны войти для просмотра вложений.
    #18450
    kdv
    Участник

    Не понимаю как красиво передать параметры начальной и конечной точки

    раз уж используется смесь паззлов и JS, то тут без вариантов. Паззлы выдают позицию объекта как массив, а не как вектор. поэтому в JS коде приходится создавать вектор из массива координат
    const pointOne = new v3d.Vector3(pt1[0], pt1[2], -pt1[1]);
    это единственный способ, хоть и не очень красивый )))

    И как через JavaScript установить позицию?

    можно по координатам, можно по вектору. вектор – это уже позиция, а из координат еще надо создать вектор
    clndr.position.set(pt1[0], pt1[2], -pt1[1]); – по координатам XYZ
    clndr.position.copy(pointOne); – по вектору

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

    #18455
    xfish3
    Участник

    Решил пока остановиться на таком варианте. Главное – работает то, для чего я хотел управлять.
    Как проработаю другой способ управления – отпишусь, может тоже кому-то полезно будет.
    Спасибо огромное за помощь! :good:

    #18457
    kdv
    Участник

    Выше вон набор паззлов (от задания точек в пространстве и создания самого цилиндра до его точного поворота). Можно было и не заморачиваться со скрирптами )))

    Puzzles and JS. Fast and expensive.

    If you don’t see the meaning in something it primarily means that you just don’t see it but not the absence of meaning at all.

Просмотр 14 сообщений - с 1 по 14 (из 14 всего)
  • Для ответа в этой теме необходимо авторизоваться.