首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何确定要打开哪些推进器来旋转飞船?

如何确定要打开哪些推进器来旋转飞船?
EN

Game Development用户
提问于 2012-10-25 10:43:21
回答 3查看 2.9K关注 0票数 47

船舶的结构动态变化,所以我必须确定当我想顺时针或逆时针旋转飞船时打开哪个推进器。推进器始终是轴对齐与船舶(从来没有在一个角度),或打开或关闭。以下是其中一个可能的设置:

到目前为止,我尝试的是将发射矢量和方向矢量可视化到飞船的质量中心:

不幸的是,我没有走多远。

EN

回答 3

Game Development用户

发布于 2012-10-25 13:10:20

成功!它在这里,它按其应有的方式旋转:

我所做的是:对于每个推进器,我计算扭矩的大小,相对于质量中心。

代码语言:javascript
运行
AI代码解释
复制
private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

根据维基百科的说法,扭矩管理的方程式是T = rF sin(theta),其中:

  • R是推进器和COM之间的距离。
  • F是施加的力的大小(我忽略了它,假装它只是一个,因为我只关心这个符号)。
  • theta是两个向量之间的角度。

当玩家按左键时,我检查推进器的扭矩信号--如果小于零,我就启动推进器。正相反的是顺时针旋转。

这也许可以通过使用点积来计算矢量之间夹角的余弦来改进,但是这得等到明天。

最后,这里是一个现场演示

票数 22
EN

Game Development用户

发布于 2012-10-25 14:39:12

扭矩的一般三维表达式是位移和力的交叉乘积:t=r⨯F.在二维中,扭矩的标量值就足够了,并且只给推进器四个正交的方向,我们可以用分段形式写成:

  • 向+x: t=F* (-ry)方向的力
  • -x方向的力:t=F* (ry)
  • 方向力+y: t=F* (rx)
  • -y方向的力:t=F* (-rx)

这里,F是推力器产生的力的大小,rx和ry是从支点到推进器的矢量的x和y分量。正力矩倾向于逆时针方向旋转船舶.使用上述四个公式,推导出每个推力器产生的扭矩的符号是很简单的。

要适度准确地表示物理,不仅需要知道推力的符号,还需要知道推力的总震级和转动惯量。此外,你可能不想简单地激活所有正确排列的推进器来进行旋转。

如图所示,推进器B、D和E的全部功率将使旋转最大化,但也将加速飞船向右行驶。关闭D会防止这种情况发生。如果相反,加速右转是有意的,但顺时针旋转不是,最有效的方法是使C和F在全功率的三分之二与D。

如果这没有超出你想要做的范围,你将不得不为运动方程编写某种求解器,这显然不是一个简单的任务。

票数 14
EN

Game Development用户

发布于 2012-10-26 10:23:40

一些不同的东西。首先,我们需要认识到这是一个约束不足的问题.也就是说,有许多不同的推进器组合,可以发射,以导致旋转在同一方向。我假设在你的情况下,推进器只有两种状态,“开启”和“关闭”,所有推进器输出的力相等。

第二,盯着你的模型,看起来你的“质量中心”实际上不是你的质量中心。幸运的是,这不会影响你的扭矩计算。但是,它会影响你对质量位移中心的计算。我不确定你是否关心这个水平的准确性,因为你的“质量中心”至少是离真正质量中心最近的正方形。

第三,如果你想计算某一个推进器会如何影响旋转,你就正确了,尽管你使用的是一个低效的公式。转矩可以计算为r x F,它的大小为r*F*sin(theta)。然而,在这种情况下,计算角度是一种效率低下的方法。相反,您应该直接使用扭矩的跨积定义,因为使用您所拥有的表示会更简单。因为所有的向量都没有z分量,所以交叉积的公式大大简化了。

在不更改计算结果的情况下,我们只需更新代码即可。

代码语言:javascript
运行
AI代码解释
复制
private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

这样做更好(而且更快)。

你在你自己的答案中建议,你的解决方案是在正确的方向上发射所有具有扭矩的推进器。这基本上解决了你问的问题。然而,我希望沿着这条线的某个点,你会发现你的策略不那么令人满意,如果用户按住“旋转”按钮,并且所有推力器都有正扭矩旋转,可能会将它们移动到旋转它们的顶部(我不确定你的模拟的细节程度,如果你真的计算了推进器的力,或者你只是直观地显示他们开火,然后用一个恒定的加速度或什么东西旋转你的模型。)无论哪种方式,你都希望推进器至少能精确地发射)。

你不考虑船上的净力。如果你有任意的推进器量,那么这可能会变成一个相当复杂的问题。然而,由于我们的推进器只有两种状态,所以分析起来很简单。我不知道我们的目标到底是什么,所以我可以想象出两个不同的目标:首先,我们想要最小化总力,同时仍然将扭矩保持在我们想要的方向。其次,我们要最大限度地提高扭矩与总力的比率。

顺便说一句,如果你能想象一个额外的“推进器体积”控制,同时影响所有推进器的功率,那么你可以设置这个控制,这样你的两个解决方案有相同的扭矩,你会看到第二个解只能有一个比第一个更小的位移。然而,我们需要记住,如果有可能启动推进器,使您只旋转和不移动,那么两种解决方案将是相同的。

因此,我们将讨论第二个解决方案,基于上一段的论点。现在,在分析总力时,我们可以简单地注意到,发动机只能指向四个方向。因此,x方向上的总力只是指左的推进器数减去指向右边的数,而y方向的推力也是这样。

在写完这篇文章之后,我不得不考虑更多的算法来优化它。我认为我的文章的其余部分是有帮助的,所以我会发布它,但是当我找到优化这个配置的最佳方法时,我会更新它(我已经想出了几种方法来得到近似的答案,但没有一个是精确的)。

票数 7
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/40615

复制
相关文章
Wikipedia的方言版本
闽东话版本: http://cdo.wikipedia.org/wiki/ 闽南话版本: http://zh-min-nan.wikipedia.org/wiki/ 客家话版本: http://hak.wikipedia.org/wiki/ 赣语版本: http://gan.wikipedia.org/wiki/ 吴语版本: http://wuu.wikipedia.org/wiki/ 文言版本: http://zh-classical.wikipedia.org/wiki/ 粤语版本: http://zh-yue.wikipedia.org/wiki/
ruanyf
2018/09/21
1.5K0
Wikipedia pageview数据获取(bigquery)
维基百科pageview数据是Wikimedia技术团队所维护的访问量数据集。该数据集自2015年五月启用,其具体的pageview定义为对某个网页内容的请求,会对爬虫和人类的访问量进行区分,粒度为小时级别,如下图:
千灵域
2022/06/17
2.8K0
Wikipedia pageview数据获取(bigquery)
Wikipedia创始人访谈
2001年,当他决定创办维基百科的时候,所有人都感到太疯狂了。办一个网上的百科全书,访问者可以自由编辑,连注册也不需要,你想怎么写就怎么写,目标是整理和呈现人类所有的知识。这怎么可能呢?!......
ruanyf
2018/09/21
1.2K0
Java并发编程:线程池的使用
Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。   那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?   在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPo
Ryan-Miao
2018/03/13
1.1K0
【编程基础】Java Comparator接口的使用
在实际编程中我们经常会用到集合或者数组,有的时候你需要对这个集合中的元素就行排序,那这个时候就用到了Comparator接口,先看一下接口的原型: public interface Comparator<T> { /** * Compares the two specified objects to determine their relative ordering. The ordering * implied by the return value of this method for all po
程序员互动联盟
2018/03/14
7850
10分钟拥有自己的Wikipedia
谁是花和尚? 花和尚是一个定居西雅图的程序员,拥有多年系统设计和开发经验。喜欢研究和总结System Design, 并传授给大家。花和尚在MITBBS一篇 "我的System Design总结" 文章获得超过8万访问量,并被多家网站和博客转载。 引子 相信你一定用过Wikipedia。它简单明了的页面使内容容易查找和阅读。但你有没有想过自己也可以轻松获得一个专属Wikipedia? 背景 小编从一毕业进入某电商公司,就在公司开始使用一款与Wikipedia类似的内部网站。写team wiki,项目requ
包子面试培训
2018/04/20
4.1K0
10分钟拥有自己的Wikipedia
Flink实战:消费Wikipedia实时消息
https://blog.csdn.net/boling_cavalry/article/details/85205622
程序员欣宸
2019/06/02
8420
Flink实战:消费Wikipedia实时消息
写给NLP研究者的编程指南
作者 | 赤乐君,日本某大手研发部门的NLP工程师。关注关系抽取与知识图谱的相关研究。
AI科技大本营
2019/05/06
5520
写给NLP研究者的编程指南
Java并发编程之join方法的使用
在多线程编程中,有时候一个线程的执行可能要依赖于另外一个线程的执行结果才能执行,JDK提供了join方法来实现这种功能。
布禾
2021/03/15
5420
Java-GUI编程之ImageIO的使用
在实际生活中,很多软件都支持打开本地磁盘已经存在的图片,然后进行编辑,编辑完毕后,再重新保存到本地磁盘。如果使用AWT要完成这样的功能,那么需要使用到ImageIO这个类,可以操作本地磁盘的图片文件。
愷龍
2022/09/26
4270
Java-GUI编程之ImageIO的使用
java并发编程(4)--线程池的使用
转载:http://www.cnblogs.com/dolphin0520/p/3932921.html 一. java中的ThreadPoolExecutor类 java.util.concurrent.ThreadPoolExecutor类时线程池中最核心的一个类,因此如果要透彻的了解java中线程池,必须先了解这个类。下面看ThreadPoolExecutor类的具体实现源码: 在ThreadPoolExecutor类中提供了四个构造方法: public class ThreadPoolExecuto
Ryan-Miao
2018/03/13
7710
Java 并发编程:volatile的使用及其原理
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁、偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一、volatile的作用   在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchro
用户2140019
2018/05/18
7230
Java 并发编程:volatile的使用及其原理
一、volatile的作用   在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问题。而volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,
用户2140019
2018/06/25
4590
自然语言处理(NLP)入门指南
授权转载自数据派THU ID:DatapiTHU 作者:Melanie Tosik 翻译:闵黎 校对:丁楠雅 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过
大数据文摘
2018/05/24
1.4K0
【超全资源】自然语言处理(NLP)入门学习资源清单(部分资料下载)
Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者列出了一份学习资源清单。
新智元
2018/03/27
3K0
【超全资源】自然语言处理(NLP)入门学习资源清单(部分资料下载)
Lombok 使用详解,简化Java编程
在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求
用户4172423
2019/11/28
5660
使用Java实现面向对象编程
使用Java实现面向对象编程 源码展示: 1 package cdjj.s2t075.com; 2 import java.util.Scanner; 3 public class Door { 4 /* 5 * Door为门类 6 * 它包括:开门和关门的操作 7 * 然而,因为要通过记录Person输入的信息,交由 8 * Computer计算机类进行处理,之后,再交由Door门类 9 * 进行处理所以Person要继承于Com
用户1112962
2018/07/04
1.1K0
使用Java实现面向对象编程
第一章-对象和封装 上机练习1-5答案略 简答题4 public class Student1 { String name; //姓名 private int age; //年龄 public int getAge() { return age; } public void setAge(int age) { if (age>=16) { this.age = age; }
星辰xc
2022/04/09
8450
使用Java实现面向对象编程
Lombok 使用详解,简化Java编程
在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求
码农小胖哥
2019/12/10
6460
Lombok 使用详解,简化Java编程
【独家】自然语言处理(NLP)入门指南
致谢 钟崇光博士参与了数据派THU于6月5日、THU数据派于6月8日发布的《循序渐进提升Kaggle竞赛模型精确度,以美国好事达保险公司理赔为例》一文的校对工作,并且给出了许多有建设性的意见,在此数据派翻译组对钟博士表达诚挚的感谢! 作者:Melanie Tosik 翻译:闵黎 校对:丁楠雅 本文长度为1100字,建议阅读3分钟 Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线。回顾她的学习历程,她为期望入门自然语言处理的初学者
数据派THU
2018/01/29
2K0
【独家】自然语言处理(NLP)入门指南

相似问题

如果图像高度大于宽度,则为Jquery addClass

25

如果日期大于值,则为ArrayFormula

23

如果列名大于行值,则为求和

12

如果Post值小于或大于,则为PHP

23

如果元素高度大于x addClass,则为“纵向”否则addClass“景观”

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文