Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Математическое моделирование эффекта Джанибекова

Даниил Сидоров Ученик (114), закрыт 1 год назад
Здравствуйте! Захотел решить задачу об эффекте Джанибекова с визуализацией в 3D на javasrypt с помощью библиотеки Three.js. Решал дифференциальные уравнения Эйлера, итого некоторые потуги на поворот в 180 градусов присутствуют, однако что-то идет не так. Прошу помочь с проблемой. Код на html + js прилагаю
 // Сцена и камера 
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.x = 15;
camera.position.y = 15;
camera.position.z = 25;

const renderer = new THREE.WebGLRenderer({ alpha: true });
renderer.setClearColor(0xffffff, 1);
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

//Оси координат
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

// Прямоугольник
var den = 1
var posx = 8
var posy = 1
var posz = 3
var m = posx * posy * posz * den
var Ix = m * (posy * posy + posz * posz)/12
var Iy = m * (posx * posx + posz * posz)/12
var Iz = m * (posy * posy + posx * posx)/12

const material = new THREE.MeshStandardMaterial({ color: 0x00aaff, roughness: 0.5, metalness: 0.5 });
material.shadowSide = THREE.DoubleSide;
const geometry = new THREE.BoxGeometry(posx, posy, posz);
const rectangle = new THREE.Mesh(geometry, material);
scene.add(rectangle);

//Плоскость
const planeGeometry = new THREE.PlaneGeometry(window.innerWidth, window.innerHeight);
const planeMaterial = new THREE.MeshStandardMaterial({ color: 0xbebebe });
const plane = new THREE.Mesh(planeGeometry, planeMaterial);
plane.rotation.x = -Math.PI / 2;
plane.position.y = -20
scene.add(plane);

//свет

const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(0, 10, 0);
directionalLight.castShadow = true;
scene.add(directionalLight);

renderer.shadowMap.enabled = true;
rectangle.castShadow = true;
plane.receiveShadow = true;

// камера
const controls = new THREE.OrbitControls(camera, renderer.domElement);

//движение (вокруг красной оси z )

var time = 10000
var dt = 0.001

var phinewx
var phinewy
var phinewz

var omeganewx
var omeganewy
var omeganewz

var phioldx = 0
var phioldy = 0
var phioldz = 0

var omegaoldx = 0.00000001 * 2 * Math.PI
var omegaoldy = 0.00000001 * 2 * Math.PI
var omegaoldz = 1 * 2 * Math.PI

var X = [0]
var Y = [0]
var Z = [0]

for (var i = 1; i
omeganewx = omegaoldx + (Iy - Iz)/Ix * omegaoldy * omegaoldz * dt
omeganewy = omegaoldy + (Iz - Ix)/Iy * omegaoldx * omegaoldz * dt
omeganewz = omegaoldz + (Ix - Iy)/Iz * omegaoldx * omegaoldy * dt

phinewx = phioldx + omeganewx * dt
phinewy = phioldy + omeganewy * dt
phinewz = phioldz + omeganewz * dt

omegaoldx = omeganewx
omegaoldy = omeganewy
omegaoldz = omeganewz

phioldx = phinewx
phioldy = phinewy
phioldz = phinewz

X[i] = phinewx
Y[i] = phinewy
Z[i] = phinewz
}
i = 1
function animate() {

rectangle.rotation.x = X[i]
rectangle.rotation.y = Y[i]
rectangle.rotation.z = Z[i]

if (i i++
axesHelper.rotation.copy(rectangle.rotation);
}
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}

animate();
Дополнен 1 год назад
код на html
Лучший ответ
Александр Жилинский Искусственный Интеллект (223329) 1 год назад
Попробуй уменьшить разницу между Ix, Iy, Iz. Пусть даже оставить posx, posy, posz прежними; а скорректировать формулы для I (сделать материал неоднородным)
Даниил СидоровУченик (114) 1 год назад
Здравствуйте, спасибо за совет, но, к сожалению, ситуация не изменилась
Александр Жилинский Искусственный Интеллект (223329) Даниил Сидоров, а при Ix > Iz и Iy > Iz вращение устойчивое?
Даниил СидоровУченик (114) 1 год назад
Да, вращение устойчиво
Александр Жилинский Искусственный Интеллект (223329) Даниил Сидоров, при неустойчивом омегаХ и омегаY как меняются от времени?
Даниил СидоровУченик (114) 1 год назад
Имеют периодический характер. Сначала оба растут до начала переворота, в это время далее омега Z падает до нуля, к концу переворота омегаХ и омегаY вновь опускаются до нуля, а омега Z становится отрицательным и достигает своего изначального значения. На втором перевороте ОмегаX становится меньше нуля, ОмегаY становится больше нуля, оба достигают максимума в момент когда ОмегаZ вновь становится равным нулю, далее все тоже самое, начиная с первого пункта.
Александр Жилинский Искусственный Интеллект (223329) Даниил Сидоров, "омега Z становится отрицательным и достигает своего изначального значения" - вот переворот состоялся. В чём претензии к процессу?!
Остальные ответы
Роман Сергеевич Искусственный Интеллект (191044) 1 год назад
Кто то бесплатно возиться будет. Ага,жди...
Похожие вопросы