ÐÐ°Ñ ÐºÐ¾Ð´ оÑÑавÑийÑÑ Ð¾Ñ Ð¿ÑедÑдÑÑего пÑимеÑа Ñже наÑÑÑоен на пеÑеÑиÑÐ¾Ð²ÐºÑ Ð½Ð°Ñей WebGL ÑÑÐµÐ½Ñ ÐºÐ°Ð¶Ð´Ñе 15 миллиÑекÑнд. Ðо ÑÐ¸Ñ Ð¿Ð¾Ñ Ð¼Ñ Ð¿ÑоÑÑо оÑÑиÑовÑвали в ÑоÑноÑÑи одно и Ñо же каждÑй Ñаз. ÐÑиÑло вÑÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑÑо Ñак, ÑÑÐ¾Ð±Ñ Ð½Ð°Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð½Ð°Ñал двигаÑÑÑÑ.
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð·Ð°ÑÑавим Ð½Ð°Ñ Ð´Ð²ÑмеÑнÑй квадÑÐ°Ñ Ð²ÑаÑаÑÑÑÑ Ð¸ двигаÑÑÑÑ Ð²Ð¾ вÑÐµÑ ÑÑÑÑ Ð½Ð°Ð¿ÑавлениÑÑ . ÐÑо докажеÑ, ÑÑо не ÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ð¼Ñ Ñоздавали вÑего-лиÑÑ Ð´Ð²ÑмеÑнÑй обÑекÑ, он вÑÑ ÐµÑÑ ÑÑÑеÑÑвÑÐµÑ Ð² ÑÑÑÑ Ð¼ÐµÑном пÑоÑÑÑанÑÑве.
ÐаÑÑавим квадÑÐ°Ñ Ð²ÑаÑаÑÑÑÑÐавайÑе наÑнÑм Ñ Ñого, ÑÑо заÑÑавим квадÑÐ°Ñ Ð²ÑаÑаÑÑÑÑ. ÐÐ»Ñ Ð½Ð°Ñала нам понадобиÑÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð½Ð°Ñение в коÑоÑой бÑÐ´ÐµÑ Ð¾ÑÑажаÑÑ ÑекÑÑий Ñгол повоÑоÑа наÑего квадÑаÑа:
var squareRotation = 0.0;
ТепеÑÑ Ð½Ð°Ð¼ надо измениÑÑ Ð¿ÑоÑедÑÑÑ drawScene()
и добавиÑÑ Ð² Ð½ÐµÑ ÐºÐ¾Ð´, коÑоÑÑй Ð±Ñ ÑÑиÑÑвал ÑÑÐ¾Ñ Ñгол повоÑоÑа пÑи оÑÑиÑовке квадÑаÑа в наÑей ÑÑене. ÐоÑле пеÑвонаÑалÑного ÑаÑÑÑÑа маÑÑиÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ²Ð°Ð´ÑаÑа Ð¼Ñ Ð¿ÑименÑем ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð²Ð¾ÑоÑа ÑледÑÑÑим обÑазом:
mvPushMatrix();
mvRotate(squareRotation, [1, 0, 1]);
ÐÑÐ¾Ñ ÐºÐ¾Ð´ ÑоÑ
ÑанÑÐµÑ Ð¼Ð°ÑÑиÑÑ ÑекÑÑего положениÑ, заÑем повоÑаÑÐ¸Ð²Ð°ÐµÑ Ð¼Ð°ÑÑиÑÑ Ð½Ð° ÑекÑÑее знаÑение пеÑеменной squareRotation
вокÑÑг оÑей X и Z.
ÐоÑле оÑÑиÑовки Ð¼Ñ Ð²Ð¾ÑÑÑанавливаем изнаÑалÑное ÑоÑÑоÑние маÑÑиÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ:
ÐÑ ÑÐ¾Ñ ÑанÑем и воÑÑÑанавливаем ÑоÑÑоÑние маÑÑиÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð²Ð»Ð¸Ñние повоÑоÑа на дÑÑгие обÑекÑÑ, коÑоÑÑе Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ Ð·Ð°Ñ Ð¾ÑеÑÑ Ð¾ÑобÑазиÑÑ.
ЧÑÐ¾Ð±Ñ Ð·Ð°ÑÑавиÑÑ ÐºÐ²Ð°Ð´ÑÐ°Ñ ÐºÑÑÑиÑÑÑÑ Ð½Ð°Ð¼ нÑжно добавиÑÑ Ð² пÑогÑÐ°Ð¼Ð¼Ñ ÐºÐ¾Ð´, коÑоÑÑй бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð·Ð½Ð°Ñение пеÑеменной squareRotation
во вÑемени. ÐÐ»Ñ ÑÑого Ð¼Ñ Ð·Ð°Ð²ÐµÐ´Ñм еÑÑ Ð¾Ð´Ð½Ñ Ð¿ÐµÑеменнÑÑ Ð² коÑоÑÑÑ Ð±Ñдем запиÑÑваÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾Ñледней оÑÑиÑовки (давайÑе назовÑм ÐµÑ lastSquareUpdateTime
), заÑем добавим ÑледÑÑÑий код в ÐºÐ¾Ð½ÐµÑ Ð½Ð°Ñей пÑоÑедÑÑÑ drawScene()
:
var currentTime = new Date().getTime();
if (lastSquareUpdateTime) {
var delta = currentTime - lastSquareUpdateTime;
squareRotation += (30 * delta) / 1000.0;
}
lastSquareUpdateTime = currentTime;
ÐÑÐ¾Ñ ÐºÐ¾Ð´ иÑполÑзÑÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво вÑемени пÑоÑедÑего Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа, когда Ð¼Ñ Ð² поÑледний Ñаз изменÑли знаÑение пеÑеменной squareRotation
ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÐºÐ°Ðº ÑилÑно нÑжно повеÑнÑÑÑ ÐºÐ²Ð°Ð´ÑаÑ.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ Ñакже заÑÑавиÑÑ Ð½Ð°Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð´Ð²Ð¸Ð³Ð°ÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑ ÐµÐ³Ð¾ позиÑÐ¸Ñ Ð¿ÐµÑед оÑÑиÑовкой. ÐÑим пÑимеÑом Ð¼Ñ ÑобиÑаемÑÑ Ð¿ÑодемонÑÑÑиÑоваÑÑ ÑамÑе оÑновнÑе движениÑ, оÑевидно, ÑÑо в ÑеалÑном миÑе Ð²Ñ Ð±Ñ Ñделали ÑÑо-нибÑÐ´Ñ Ð¼ÐµÐ½ÐµÐµ безÑмное.
ÐавайÑе оÑÑлеживаÑÑ Ñдвиг Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐºÐ²Ð°Ð´ÑаÑа по каждой оÑи в новÑÑ Ð¿ÐµÑеменнÑÑ :
var squareXOffset = 0.0;
var squareYOffset = 0.0;
var squareZOffset = 0.0;
Ð ÑаÑÑÑоÑние на коÑоÑое нÑжно ÑмеÑÑиÑÑ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð¿Ð¾ каждой из оÑей в ÑледÑÑÑÐ¸Ñ Ð¿ÐµÑеменнÑÑ :
var xIncValue = 0.2;
var yIncValue = -0.4;
var zIncValue = 0.3;
ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑоÑÑо добавиÑÑ ÑледÑÑÑий код к Ñже напиÑанномÑ, коÑоÑÑй обновлÑÐµÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ Ñгла повоÑоÑа:
squareXOffset += xIncValue * ((30 * delta) / 1000.0);
squareYOffset += yIncValue * ((30 * delta) / 1000.0);
squareZOffset += zIncValue * ((30 * delta) / 1000.0);
if (Math.abs(squareYOffset) > 2.5) {
xIncValue = -xIncValue;
yIncValue = -yIncValue;
zIncValue = -zIncValue;
}
Ð, наконеÑ, Ð¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñем в пÑоÑедÑÑÑ drawScene()
ÑледÑÑÑий код:
mvTranslate([squareXOffset, squareYOffset, squareZOffset]);
ÐÑо заÑÑÐ°Ð²Ð¸Ñ Ð½Ð°Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð´Ð²Ð¸Ð³Ð°ÑÑÑÑ Ð¿Ð¾ ÑкÑанÑ, пÑиближаÑÑÑ Ð¸ ÑдалÑÑÑÑ Ð¾Ñ Ð½Ð°Ð±Ð»ÑдаÑÐµÐ»Ñ Ð¸ пÑи ÑÑом еÑÑ Ð¸ вÑаÑаÑÑÑÑ. ÐÑо Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на ÑабоÑÑ Ð·Ð°ÑÑавки
ÐÑли Ð²Ð°Ñ Ð±ÑаÑÐ·ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑабоÑÑ Ñ WebGL, пÑоÑледÑйÑе по ÑÑой ÑÑÑлке, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑмоÑÑеÑÑ Ð½Ð° ÑÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð² дейÑÑвии.
ÐолÑÑе опеÑаÑий Ñ Ð¼Ð°ÑÑиÑамиÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÐµÑ Ð½ÐµÑколÑко дополниÑелÑнÑÑ Ð¾Ð¿ÐµÑаÑий над маÑÑиÑами вклÑÑÐ°Ñ Ð´Ð²Ðµ ÑÑилиÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñо ÑÑÑком ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð°ÑÑÐ¸Ñ Ð¸ однÑ, повоÑаÑиваÑÑÑÑ Ð¼Ð°ÑÑиÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° заданное колиÑеÑÑво гÑадÑÑов. Ðалее пÑиведÑн код Ð´Ð»Ñ Ð²Ð°Ñего ÑдобÑÑва:
var mvMatrixStack = [];
function mvPushMatrix(m) {
if (m) {
mvMatrixStack.push(m.dup());
mvMatrix = m.dup();
} else {
mvMatrixStack.push(mvMatrix.dup());
}
}
function mvPopMatrix() {
if (!mvMatrixStack.length) {
throw "Can't pop from an empty matrix stack.";
}
mvMatrix = mvMatrixStack.pop();
return mvMatrix;
}
function mvRotate(angle, v) {
var inRadians = (angle * Math.PI) / 180.0;
var m = Matrix.Rotation(inRadians, $V([v[0], v[1], v[2]])).ensure4x4();
multMatrix(m);
}
ÐÑи ÑÑилиÑÑ Ð±Ñли заимÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð¸Ð· пÑимеÑа ÑазÑабоÑанного Ðладом ÐÑкиÑевиÑем (Vlad VukiÄeviÄ).
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4