|
29.06.2014, 15:50
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
2D вращение
2D выпуклые тела. При коллизии, используя SAT нахожу вектор проникновения одного тела в другое. Плюсую к скоростям тел данный вектор - коллизия решена.
А как можно вычислить вращение двух тел после коллизии? Как я понимаю, вектор вращения будет перпендикулярен вектору проникновения, но как узнать направление( по часовой, против часовой ) этого вектора?
|
(Offline)
|
|
29.06.2014, 22:48
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: 2D вращение
|
(Offline)
|
|
29.06.2014, 23:55
|
#3
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
Знания физики дают возможность делать довольно красивые демки
https://dl.dropboxusercontent.com/u/...oth/index.html
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Nikich за это полезное сообщение:
|
|
30.06.2014, 00:09
|
#4
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: 2D вращение
момент инерции
то есть у тела есть центр тяжести и есть линия действия силы на тело вот перпендикуляр на эту линию от центра будет плечом для момента который создает эта сила. и закручивает эта сила тело по часовой или против часовой стрелки в зависимости от направления вектора силы или импульса причем на угловое ускорение равное делению момента инерции этого тела на полученный момент сил.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.06.2014, 00:13
|
#5
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
В смысле от направления силы? Направление силы может быть одинаковым, а тело будет крутиться по разному.
|
(Offline)
|
|
30.06.2014, 00:22
|
#6
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: 2D вращение
направление вектора силы вдоль линии действия ж
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.06.2014, 00:25
|
#7
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
Т.е. в любом случае необходимо найти саму точку касания?
|
(Offline)
|
|
30.06.2014, 00:27
|
#8
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: 2D вращение
ага, а вообще это все хорошо в курсе термеха дается во всяких плоскопаралельных и прочих видах движения
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.06.2014, 23:41
|
#9
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
https://dl.dropboxusercontent.com/u/...emp/index.html
Вот, собственно, что получилось. Вершины полигонов тягаются.
Для расчета движения вершин использовал метод интегрирования Верле, как и в симуляции ткани. Если кому-нибудь интересно, рассказал бы о реализации
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Nikich за это полезное сообщение:
|
|
01.07.2014, 00:08
|
#10
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D вращение
А можно туда 32+ кубика?
Как с трением и упругостью, настраиваемо?
Заметил что кубик на кубике не хочет лежать.
Прикольно! Тебе точно не нужно учиться, поверь - ты пожалеешь о 5 годах жизни, а 5 лет в твоём возрасте - это драгоценное время, очень-очень.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.07.2014, 00:48
|
#11
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
В плане производительности - да, можно, работает довольно шустро.
Но систему нужно допиливать, так как она работает нестабильно, когда одно тело лежит на другом.
Параметры легко настраиваются.
На счет образования: блин, живя в Лондоне легко так говорить А я не представляю, как отсюда можно перебраться за бугор, не имея лучших знаний.
|
(Offline)
|
|
01.07.2014, 03:16
|
#12
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: 2D вращение
|
(Offline)
|
|
01.07.2014, 08:12
|
#13
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: 2D вращение
У тебя как-то резко выкидывает из пересечения
moka, 30 штук нормально работает, хорошая производительность, а 200 - FPS = 5
(134 строка для смены количества, 147 строка - изменение размера)
(Nicith не против, что я его исходник правлю? )
Nicith, я бы не делал на твоем месте много циклов, а то ты считаешь нормали в цикле, сохраняешь их, а потом опять в цикле (в другом) читаешь их, а циклы все одной длины.
Nicith, я исправил несколько опечаток (при расчете смещения по x и y в нескольких местах вместо y стоял x(копипаста))
<<html data-savefrom-tab-data="{"module":"lm","tooltip":"Найдено ссылок: 0"}"><head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"><style type="text/css"></style></head><body data-savefrom-link-count="0"><div style="width:800; height:600;margin: auto;"> <span id="output" style="position: absolute;">FPS: 55</span>
<canvas id="canvas" width="800" height="600" style="width: 800; height: 600;"></canvas> </div> <script> window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { window.setTimeout(callback, 1000 / 60); }; var out = document.getElementById("output"); var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var lastTick = + new Date(); var dt = 0;
ctx.fillStyle = "#000"; ctx.strokeStyle = "rgba(60,60,60,1)"; ctx.lineWidth = 1; var mouse = { down: false, button: 1, x: 0, y: 0, px: 0, py: 0 }; var settings={ w: 60, h: 30, size: 100, k: 2.5, gravity: {x:0, y:500}, physics_iterations: 3 }; canvas.onmousedown = function (e) { mouse.button = e.which; mouse.px = mouse.x; mouse.py = mouse.y; var rect = canvas.getBoundingClientRect(); mouse.x = e.clientX - rect.left, mouse.y = e.clientY - rect.top, mouse.down = true; e.preventDefault(); };
canvas.onmouseup = function (e) { mouse.down = false; e.preventDefault(); };
canvas.onmousemove = function (e) { mouse.px = mouse.x; mouse.py = mouse.y; var rect = canvas.getBoundingClientRect(); mouse.x = e.clientX - rect.left, mouse.y = e.clientY - rect.top, e.preventDefault(); };
canvas.oncontextmenu = function (e) { e.preventDefault(); }; function collide(a1, a2, b1, b2) { var result;
var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
if ( u_b != 0 ) { var ua = ua_t / u_b; var ub = ub_t / u_b;
if ( 0 <= ua && ua <= 1 && 0 <= ub && ub <= 1 ) { result = {x:a1.x + ua * (a2.x - a1.x),y:a1.y + ua * (a2.y - a1.y)}; } else { // result = new Intersection("No Intersection"); result = 0; } } else { if ( ua_t == 0 || ub_t == 0 ) { // result = new Intersection("Coincident"); result = 0; } else { // result = new Intersection("Parallel"); result = 0; } }
return result; } var shapes = []; function createPoint(shape,x,y,weight){ shape.points.push({x:x,y:y,px:x,py:y,ax:0,ay:0,link:[],weight: weight}); } function createLink(shape,i,j,edge){ shape.constrs.push({i:i,j:j,len:Math.sqrt((shape.points[i].x-shape.points[j].x)*(shape.points[i].x-shape.points[j].x)+(shape.points[i].y-shape.points[j].y)*(shape.points[i].y-shape.points[j].y)), edge: edge}); } function createShape(pts){ var shape = {points: [], constrs: [], cmx: 0, cmy: 0}; for (var i=0;i < pts.length; i++){ if (typeof pts[i][2] == 'undefined') pts[i][2]=1; createPoint(shape,pts[i][0],pts[i][1],pts[i][2]); shape.cmx += pts[i][0]; shape.cmy += pts[i][1]; } shape.cmx /= pts.length; shape.cmy /= pts.length; for (var i=0; i<pts.length; i++){ for (var j=i+1; j<pts.length; j++){ createLink(shape,i,j,(((j-i)==1)||((pts.length-j-i)==1))); } } shapes.push(shape); }
//createShape([[100,100],[150,200],[50,200]]); //createShape([[300,300],[400,300],[400,400],[300,400]]); //createShape([[300,300],[400,300],[400,400],[300,400]]); //createShape([[300,300],[400,300],[400,400],[300,400]]); //createShape([[300,300],[400,300],[400,400],[300,400]]); //createShape([[300,300],[400,300],[400,400],[300,400]]); //createShape([[500,300],[600,300],[600,400],[500,400]]); //createShape([[100,100],[150,200],[150,250],[50,200]]); //createShape([[100,100],[130,200],[70,200]]); var getRandomInt = function(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
for(var i=0;i<3;i++){ var x = getRandomInt(200,600); var y = getRandomInt(100,500); var s = getRandomInt(3,8); var seg = new Array(); for(var l=0;l<s;l++){ var r = getRandomInt(60,120); var a = 2*Math.PI*(l/s); seg.push([Math.cos(a)*r+x,Math.sin(a)*r+y]) } createShape(seg); }
var pinned = 0;
function updateForces(){ if (!mouse.down) pinned = 0; for (var k=0; k<shapes.length; k++){ var points = shapes[k].points; for (var i=0; i<points.length; i++){ if (!points[i]) continue; var point = points[i]; point.ax = settings.gravity.x; point.ay = settings.gravity.y; if (!pinned && mouse.down && ((point.x-mouse.x)*(point.x-mouse.x)+(point.y-mouse.y)*(point.y-mouse.y)<1024)){ pinned = points[i]; if (mouse.button==3) {delete points[i]; break;} } } } pinned.x += (mouse.x-mouse.px); pinned.y += (mouse.y-mouse.py); // ctx.strokeStyle = "green"; // ctx.lineWidth = 3; // ctx.beginPath(); // ctx.moveTo(pinned.x,pinned.y); // ctx.lineTo(pinned.x + (mouse.x-mouse.px)*100,pinned.y + (mouse.y-mouse.py)*100); // ctx.stroke(); // ctx.lineWidth = 1; } function updatePhysics(dt){ for (var k=0; k<shapes.length; k++){ var shape1 = shapes[k]; var points = shape1.points; var constrs = shape1.constrs; // for (var k2=0; k2<shapes.length; k2++){ // // if (k2==k) continue; // var points2 = shapes[k2].points; // var constrs2 = shapes[k2].constrs; // for (var i=0; i<constrs.length; i++){ // if (!constrs[i].edge) continue; // for (var j=0; j<constrs2.length; j++){ // if (!constrs2[j].edge) continue; // var tmp = collide(points[constrs[i].i],points[constrs[i].j],points2[constrs2[j].i],points2[constrs2[j].j]); // if (tmp){ // var closest,closestp,closest2, closestp2; // var point1 = points[constrs[i].i], point2 = points[constrs[i].j], // point3 = points2[constrs2[j].i], point4 = points2[constrs2[j].j]; // var dx1 = point1.x - tmp.x,dy1 = point1.y - tmp.y; // var dx2 = point2.x - tmp.x,dy2 = point2.y - tmp.y; // var dx3 = point3.x - tmp.x,dy3 = point3.y - tmp.y; // var dx4 = point4.x - tmp.x,dy4 = point4.y - tmp.y; // // if (dx1*dx1+dy1*dy1<dx2*dx2+dy2*dy2) // closest = {x:dx1,y:dy1}, closestp = point1; // else // closest = {x:dx2,y:dy2}, closestp = point2; // if (dx3*dx3+dy3*dy3<dx4*dx4+dy4*dy4) // closest2 = {x:dx3,y:dy3}, closestp2 = point3; // else // closest2 = {x:dx4,y:dy4}, closestp2 = point4; // if (closest2.x*closest2.x+closest2.y*closest2.y<closest.x*closest.x+closest.y*closest.y){ // closest = closest2; // closestp = closestp2; // var t = point1; // var t2 = point2; // point1 = point3; // point3 = t; // point2 = point4; // point4 = t2; // // } // // points[constrs[i].i].x -= closest.x/2; // points[constrs[i].j].x -= closest.x/2; // points[constrs[i].i].y -= closest.y/2; // points[constrs[i].j].y -= closest.y/2; // points2[constrs2[j].i].x += closest.x/2; // points2[constrs2[j].j].x += closest.x/2; // points2[constrs2[j].i].y += closest.y/2; // points2[constrs2[j].j].y += closest.y/2; // var startx = point3.x, starty = point3.y; // var endx = point4.x, endy = point4.y; // var dot = (endx-startx)*closest.x+(endy-starty)*closest.y; // if (dot>0) // startx = point4.x, // starty = point4.y, // endx = point3.x, // endy = point3.y, // dot = (endx-startx)*closest.x+(endy-starty)*closest.y; // // var x = endx - startx, y = endy - starty; // var len = Math.sqrt(x*x+y*y); // dot /= len; // x /= len; y /= len; // x *= dot; y *= dot; // // var deltax = closest.x - x, deltay = closest.y - y; // ctx.strokeStyle = "rgba(60,60,255,1)"; // ctx.fillStyle = "rgba(60,60,255,1)"; // ctx.lineWidth = 4; // // ctx.beginPath(); // ctx.moveTo(tmp.x,tmp.y); // ctx.lineTo(tmp.x+x,tmp.y+y); // ctx.stroke(); // ctx.beginPath(); // ctx.strokeStyle = "rgba(255,60,60,1)"; // ctx.moveTo(tmp.x,tmp.y); // ctx.lineTo(tmp.x+closest.x,tmp.y+closest.y); // ctx.stroke(); // ctx.beginPath(); // ctx.strokeStyle = "rgba(60,255,60,1)"; // ctx.moveTo(tmp.x,tmp.y); // ctx.lineTo(tmp.x+deltax,tmp.y+deltay); // ctx.stroke(); // ctx.fillStyle = "rgba(255,0,0,1)"; // closestp.x -= deltax/2; // closestp.y -= deltay/2; // points[constrs[i].i].x -= deltax/4; // points[constrs[i].j].x -= deltax/4; // points[constrs[i].i].y -= deltay/4; // points[constrs[i].j].y -= deltay/4; // points2[constrs2[j].i].x += deltax/4; // points2[constrs2[j].j].x += deltax/4; // points2[constrs2[j].i].y += deltay/4; // points2[constrs2[j].j].y += deltay/4; // } // } // } // ctx.strokeStyle = "rgba(60,60,60,1)"; // ctx.lineWidth = 1; // } for (var k2=k+1; k2<shapes.length; k2++){ var points1 = points;//shapes[k].points; var points2 = shapes[k2].points; var shape2 = shapes[k2]; var minDepth = 100500; var minAxis = 0; var axises = []; for (var j=0; j<points1.length; j++){ var start,end; if (j) end = points1[j], start = points1[j-1]; else start = points1[points1.length-1], end = points1[0]; var e1 = {x: start.x - end.x, y: start.y - end.y}; var t = Math.sqrt(e1.x*e1.x+e1.y*e1.y); axises.push({x: -e1.y/t, y: +e1.x/t, s: shape1}); }
for (var j=0; j<points2.length; j++){ var start,end; if (j) end = points2[j], start = points2[j-1]; else start = points2[points2.length-1], end = points2[0]; var e1 = {x: start.x - end.x, y: start.y - end.y}; var t = Math.sqrt(e1.x*e1.x+e1.y*e1.y); axises.push({x: -e1.y/t, y: +e1.x/t, s: shape2}); } var collided = 0; for (var a=0; a<axises.length; a++){ var shape1min = {x:100500}, shape1max = {x:-100500}; for (var p=0; p<points1.length; p++){ var proj = points1[p].x*axises[a].x+points1[p].y*axises[a].y; if (shape1min.x>proj) shape1min = {x: proj, p: points1[p], s: 1}; if (shape1max.x<proj) shape1max = {x: proj, p: points1[p], s: 1}; } var shape2min = {x:100500}, shape2max = {x:-100500}; for (var p=0; p<points2.length; p++){ var proj = points2[p].x*axises[a].x+points2[p].y*axises[a].y; if (shape2min.x>proj) shape2min = {x: proj, p: points2[p], s: 2}; if (shape2max.x<proj) shape2max = {x: proj, p: points2[p], s: 2}; } var max = shape1max.x>shape2max.x?shape2max:shape1max; var min = shape1min.x>shape2min.x?shape1min:shape2min; var diff = max.x - min.x; if (diff<0) {break;} if (diff<minDepth) { minDepth = diff; minAxis = {a: axises[a], p1: min.p, p2: max.p, s1: min.s, s2: max.s}; } if (a == axises.length - 1) collided = 1; } if (collided){ // if (minAxis.s==shape2){ // var ttt = shape1; // shape1 = shape2; // shape2 = ttt; // } // for (var p=0; p<shape1.points.length; p++){ // shape1.points[p].x -= minAxis.x * minDepth; // shape1.points[p].y -= minAxis.y * minDepth; // } // for (var p=0; p<shape2.points.length; p++){ // shape2.points[p].x += minAxis.x * minDepth; // shape2.points[p].y += minAxis.y * minDepth; // } var dx = minDepth*minAxis.a.x, dy = minDepth*minAxis.a.y; ctx.strokeStyle = "green"; ctx.beginPath(); ctx.moveTo(minAxis.p1.x,minAxis.p1.y); ctx.lineTo(minAxis.p1.x + dx*50,minAxis.p1.y + dy*50); ctx.stroke(); if (minAxis.s1==1){ var tx = shape1.cmx - minAxis.p1.x, ty = shape1.cmy - minAxis.p1.y; var len = Math.sqrt(tx*tx+ty*ty); tx /= len; ty /= len; var r = -tx*minAxis.a.y+ty*minAxis.a.x;
for (var t=0; t<points1.length; t++) { var rx = (shape1.cmy - points1[t].y), ry = -(shape1.cmx - points1[t].x); var len = Math.sqrt(rx*rx+ry*ry); rx = r * rx / len; ry = r * ry / len;
points1[t].x+=dx/2+rx; points1[t].y+=dy/2+ry; } var tx = shape2.cmx - minAxis.p1.x, ty = shape2.cmy - minAxis.p1.y; var len = Math.sqrt(tx*tx+ty*ty); tx /= len; ty /= len; var r = tx*minAxis.a.y-ty*minAxis.a.x;
for (var t=0; t<points2.length; t++) { var rx = (shape2.cmy - points2[t].y), ry = -(shape2.cmx - points2[t].x); var len = Math.sqrt(rx*rx+ry*ry); rx = r * rx / len; ry = r * ry / len;
points2[t].x+=-dx/2+rx; points2[t].y+=-dy/2+ry; } } else{ var tx = shape1.cmx - minAxis.p1.x, ty = shape1.cmy - minAxis.p1.y; var len = Math.sqrt(tx*tx+ty*ty); tx /= len; ty /= len; var r = tx*minAxis.a.y-ty*minAxis.a.x;
for (var t=0; t<points1.length; t++) { var rx = (shape1.cmy - points1[t].y), ry = -(shape1.cmx - points1[t].x); var len = Math.sqrt(rx*rx+ry*ry); rx = r * rx / len; ry = r * ry / len;
points1[t].x+=-dx/2+rx; points1[t].y+=-dy/2+ry; } var tx = shape2.cmx - minAxis.p1.x, ty = shape2.cmy - minAxis.p1.y; var len = Math.sqrt(tx*tx+ty*ty); tx /= len; ty /= len; var r = -tx*minAxis.a.y+ty*minAxis.a.x;
for (var t=0; t<points2.length; t++) { var rx = (shape2.cmy - points2[t].y), ry = -(shape2.cmx - points2[t].x); var len = Math.sqrt(rx*rx+ry*ry); rx = r * rx / len; ry = r * ry / len;
points2[t].x+=dx/2+rx; points2[t].y+=dy/2+ry; } } // ctx.beginPath(); // ctx.moveTo(minAxis.p2.x,minAxis.p2.y); // ctx.lineTo(minAxis.p2.x - dx*50,minAxis.p2.y - dy*50); // ctx.stroke(); // minAxis.p1.x += dx; // minAxis.p1.y += dy; // minAxis.p2.x -= dx; // minAxis.p2.y -= dy; }
}
for (var i=0; i<constrs.length; i++){ if (!constrs[i] || !points[constrs[i].i] || !points[constrs[i].j]) continue; var point1 = points[constrs[i].i],point2 = points[constrs[i].j]; var deltax = point2.x - point1.x; var deltay = point2.y - point1.y; var deltal = Math.sqrt(deltax*deltax+deltay*deltay); //if (deltal>settings.k*constrs[i].len) {delete constrs[i]; continue;} if (!point1.weight && !point2.weight) continue; var d = (deltal-constrs[i].len)/(deltal*(point1.weight+point2.weight)); deltax *= d*.5; deltay *= d*.5; point1.x += deltax*point1.weight; point1.y += deltay*point1.weight; point2.x -= deltax*point2.weight; point2.y -= deltay*point2.weight; } shapes[k].cmx = 0; shapes[k].cmy = 0; for (var i=0; i<points.length; i++){ if (!points[i]) continue; var point = points[i]; var tmpx = point.x; var tmpy = point.y; if (point.weight) { point.x += (point.x-point.px)*.99+(point.ax*dt*dt); point.y += (point.y-point.py)*.99+(point.ay*dt*dt); } point.x = Math.max(Math.min(point.x,canvas.width),0); point.y = Math.max(Math.min(point.y,canvas.height),0); point.px = tmpx; point.py = tmpy; shapes[k].cmx += point.x; shapes[k].cmy += point.y; } shapes[k].cmx /= points.length; shapes[k].cmy /= points.length; } } function draw(){ ctx.strokeStyle = "black"; ctx.fillStyle = "black"; ctx.beginPath(); for (var k=0; k<shapes.length; k++){ var points = shapes[k].points, constrs = shapes[k].constrs; for (var i=0; i<constrs.length; i++){ if (!constrs[i] || !constrs[i].edge || !points[constrs[i].i] || !points[constrs[i].j]) continue; var point1 = points[constrs[i].i],point2 = points[constrs[i].j]; ctx.moveTo(point1.x,point1.y); ctx.lineTo(point2.x,point2.y); } ctx.fillRect(shapes[k].cmx-4,shapes[k].cmy-4,8,8); } ctx.stroke(); } function main(){ ctx.fillStyle="#fff"; ctx.fillRect(0,0,800,600); updateForces(); for (var i=0; i<settings.physics_iterations; i++) updatePhysics(.016); draw(); var time = + new Date; dt = (time - lastTick)/1000; lastTick = time; requestAnimationFrame(main); } main(); setInterval(function(){out.innerHTML="FPS: "+Math.floor(1/dt);},1000); </script> </body></html>
Последний раз редактировалось RegIon, 01.07.2014 в 12:11.
|
(Offline)
|
|
01.07.2014, 11:36
|
#14
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: 2D вращение
Я вообще не оптимизировал код. В идеале, нужно сразу проверять по Bounding box'ам, а уже потом делать проверку по SAT.
Очень вряд ли, что это были опечатки. X и Y меняются местами, когда нужен вектор, перпендикулярный данному.
Сегодня выложу демку с читабельным кодом, возможно удастся пофиксить кривости при нахождении одного тела на другом.
|
(Offline)
|
|
01.07.2014, 12:09
|
#15
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: 2D вращение
points2[t].x+=dx/2+rx;
points2[t].y+=dy/2+rx;
не уверен что так должно быть
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:47.
|