热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【30分钟学完】canvas动画|游戏基本(6):坐标扭转探讨

媒介本篇主要讲坐标扭转及其运用,这是编程动画必不可少的手艺。浏览本篇前请先打好前面的基本。本人才能有限,迎接牛人配合议论,批评指正。坐标扭转模仿场景:已知一个中间点(centerX

媒介

本篇主要讲坐标扭转及其运用,这是编程动画必不可少的手艺。
浏览本篇前请先打好前面的基本。
本人才能有限,迎接牛人配合议论,批评指正。

坐标扭转

模仿场景:已知一个中间点(centerX,centerY),扭转前物体ball(x1,y1),扭转弧度(rotation);求扭转后物体(x2,y2)。(以下图)

《【30分钟学完】canvas动画|游戏基本(6):坐标扭转探讨》

坐标扭转就是说缭绕某个点扭转坐标,我们要根据扭转的角度(弧度),盘算出物体扭转前后的坐标,平常有两种要领:

简朴坐标扭转

灵活运用前章节的三角函数学问能够很轻易处置惩罚,基本思路:

  1. 盘算物体初始相关于中间点的位置;
  2. 运用atan2盘算弧度angle;
  3. 运用勾股定理盘算半径radius;
  4. angle+rotation后运用cos盘算扭转后x轴位置,用sin盘算扭转后y轴位置。

下面是示例是采纳这类要领的圆周运动,个中vr为ball相关于中间点的弧度变化速率,因为扭转半径是牢固的,所以没有在动画轮回里每次都猎取。
完全示例:简朴坐标扭转演示

/**
* 简朴坐标扭转演示
* */
window.Onload= function () {
const canvas = document.getElementById('canvas');
const cOntext= canvas.getContext('2d');
const ball = new Ball();
ball.x = 300;
ball.y = 200;
// 弧度变化速率
const vr = 0.05;
// 中间点位置设定在画布中间
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
// ball相对与中间点的间隔
const dx = ball.x - centerX;
const dy = ball.y - centerY;
// ball相对与中间点的弧度
let angle = Math.atan2(dy, dx);
// 扭转半径
const radius = Math.sqrt(dx ** 2 + dy ** 2);
(function drawFrame() {
window.requestAnimationFrame(drawFrame, canvas);
context.clearRect(0, 0, canvas.width, canvas.height);
ball.x = centerX + Math.cos(angle) * radius;
ball.y = centerY + Math.sin(angle) * radius;
angle += vr;
ball.draw(context);
}());
};

坐标扭转公式

上面的要领关于单个物体来说是很适宜的,特别是角度和半径只需盘算一次的状况。但是在更动态的场景中,能够须要扭转多个物体,而他们相关于中间点的位置各不相同。所以每一帧都要盘算每一个物体的间隔、角度和半径,然后把vr累加在角度上,末了盘算物体新的坐标。如许明显不会是文雅的做法。
抱负的做法是用数学要领推导出扭转角度与位置的关联,直接每次代入盘算即可。推导历程以下图:

《【30分钟学完】canvas动画|游戏基本(6):坐标扭转探讨》

实在推导历程不重要,我们只须要记着以下两组公式,个中dx2和dy2是ball完毕点相关于中间点的间隔,所以获得物体完毕点,还要离别加上中间点坐标。

// 正向挑选
dx2 = (x1 - centerX) * cos(rotation) - (y1 - centerY) * sin(rotation)
dy2 = (y1 - centerY) * cos(rotation) + (x1 - centerX) * sin(rotation)
// 反向挑选
dx2 = (x1 - centerX) * cos(rotation) + (y1 - centerY) * sin(rotation)
dy2 = (y1 - centerY) * cos(rotation) - (x1 - centerX) * sin(rotation)

下面是示例是采纳这类要领的圆周运动,个中dx1和dy1是ball起始点相关于中间点的间隔,dx2和dy2是ball完毕点相关于中间点的间隔。
完全示例:高等坐标扭转演示

/**
* 高等坐标扭转演示
* */
window.Onload= function () {
const canvas = document.getElementById('canvas');
const cOntext= canvas.getContext('2d');
const ball = new Ball();
ball.x = 300;
ball.y = 200;
// 弧度变化速率
const vr = 0.05;
// 中间点位置设定在画布中间
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
// 因为vr是牢固的能够先盘算正弦和余弦
const cos = Math.cos(vr);
const sin = Math.sin(vr);
(function drawFrame() {
window.requestAnimationFrame(drawFrame, canvas);
context.clearRect(0, 0, canvas.width, canvas.height);
// ball相对与中间点的间隔
const dx1 = ball.x - centerX;
const dy1 = ball.y - centerY;
// 代入公式求出ball在完毕相对与中间点的间隔
const dx2 = dx1 * cos - dy1 * sin;
const dy2 = dy1 * cos + dx1 * sin;
// 求出x2,y2
ball.x = centerX + dx2;
ball.y = centerY + dy2;
ball.draw(context);
}());
};

斜面反弹

前面的章节中我们引见过越界的一种处置惩罚方法是反弹,因为边境是矩形,反弹面垂直或程度,所以能够直接将对应轴的速率取反即可,但关于非垂直或程度的反弹面这类要领是不实用的。
坐标扭转罕见的运用就是处置惩罚这类状况,将不规律方向的复杂问题简朴化。
基本思路:(扭转前后如图)

  1. 运用扭转公式,扭转全部体系,将斜面场景转变为程度场景;
  2. 在程度场景中处置惩罚反弹;
  3. 再扭转返来。

《【30分钟学完】canvas动画|游戏基本(6):坐标扭转探讨》

示例是一个球掉落到一条线上,球遭到重力加速率影响着落,遇到斜面就会反弹,每次反弹都邑消耗速率。
完全示例:斜面反弹示例

window.Onload= function () {
const canvas = document.getElementById('canvas');
const cOntext= canvas.getContext('2d');
const ball = new Ball();
// line类组织函数参数(开始点x轴坐标,开始点y轴坐标,完毕点x轴坐标,完毕点y轴坐标)
const line = new Line(0, 0, 500, 0);
// 设置重力加速率
const gravity = 0.2;
// 设置反弹系数
const bounce = -0.6;
ball.x = 100;
ball.y = 100;
line.x = 0;
line.y = 200;
line.rotation = 10 * Math.PI / 180;
const cos = Math.cos(line.rotation);
const sin = Math.sin(line.rotation);
(function drawFrame() {
window.requestAnimationFrame(drawFrame, canvas);
context.clearRect(0, 0, canvas.width, canvas.height);
ball.vy += gravity;
ball.x += ball.vx;
ball.y += ball.vy;
// 猎取ball与line的相对位置
let x1 = ball.x - line.x;
let y1 = ball.y - line.y;
// 扭转坐标系(反向)
let y2 = y1 * cos - x1 * sin;
// 根据扭转值实行反弹
if (y2 > -ball.radius) {
// 扭转坐标系(反向)
const x2 = x1 * cos + y1 * sin;
// 扭转速率(反向)
const vx1 = ball.vx * cos + ball.vy * sin;
let vy1 = ball.vy * cos - ball.vx * sin;
y2 = -ball.radius;
vy1 *= bounce;
// 将一切东西反转(正向)
x1 = x2 * cos - y2 * sin;
y1 = y2 * cos + x2 * sin;
ball.vx = vx1 * cos - vy1 * sin;
ball.vy = vy1 * cos + vx1 * sin;
ball.x = line.x + x1;
ball.y = line.y + y1;
}
ball.draw(context);
line.draw(context);
}());
};

推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
author-avatar
曾明铭智瑜淑岳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有