为了旋转/平移对象(仅围绕 z 轴旋转和仅在 xy 平面中平移)不仅w.r.t 到全局中心(设备中心)而且还w.r.t 其他任意点,我创建了一个算法,这是正确的(因为我讨论过的所有高级编码人员都认为它是正确的),但是在实现中删除一个不需要的翻译需要很多时间(算法是在 8 月 4 日创建的并在同一天实现,此后代码修改了15次)。
这里是实现 http://www.pixdip.com/opengles/transform.php#ALGO1
产生不需要的翻译的代码行在里面:
private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
并在下面列出:
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
objX = GLES20Renderer._uBodyCentreMatrix[0];
objY = GLES20Renderer._uBodyCentreMatrix[1];
即使进行了以下更改,沿 +Y 的不良翻译仍然存在:
objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];
zAngle = 0;
ds = 0;
值 -0.545867f 会在每次调用 onDrawFrame() 时添加到 Y 坐标,因为 Renderer 类的这些字段:
private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};
protected 静态浮点[] _uBodyCentreMatrix = new float[4];
在 http://www.pixdip.com/opengles/transform.php#FIELDS
我需要帮助来了解为什么会发生这种不希望的转换,转换到底出了什么问题,或者是算法有问题。
Gimbal 锁可能是个问题吗?
请不要让我执行/练习更简单的示例,因为我已经准备好了 Renderer 类,用于关于全局 z 轴的旋转/平移,而我正在进行的这个新任务使用相同的类,在 updateModel()
(请注意,所需的旋转仅围绕 z 轴,并且仅在 xy 平面上平移)
[API 10->15]
实际的 Renderer 类有两个对象:tank turret(nozzle) 和 tank body,而 turret(nozzle) 有不需要的向前平移, body 有不需要的向后平移
关于设备中心的平移/旋转 Apk(在 opengles 2.0 中很容易制作): http://www.pixdip.com/opengles/global.php
用于关于任意点的平移/旋转的 Apk(沿 +Y 有不希望的平移): http://www.pixdip.com/opengles/local.php
用于平移/旋转的 Apk,其中 updateModel() 仅被调用 4 次: http://www.pixdip.com/opengles/limited.php 和所需的代码(应该足够了)在这里:http://www.pixdip.com/opengles/code.php
对象的一部分(喷嘴/炮塔, body )当前围绕它们自己的中心而不是对象的中心(即_playerCentre)旋转,我稍后会修改它。
最佳答案
看起来问题是:
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
Matrix.multiplyMV 是一种将 4 元素向量乘以 4x4 矩阵并将结果存储在 4 元素列向量中的方法。在矩阵表示法中:结果 = lhs x rhs。如果 resultVector 元素与 lhsMatrix 或 rhsVector 元素重叠,则 resultVector 元素值未定义。
我认为您没有发布所有代码,因此我无法确定,但根据您对“_uBodyCentreMatrix”的命名判断,您可能遇到错误,因为它不是 4 元素列向量。
我假设“_ModelMatrixBody”是一个 4x4 矩阵,“_uBodyCentre”是一个 4 元素向量,否则这些也可能有问题。
关于android - 旋转/平移矩阵的适当乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965593/
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
有没有人用ruby解决这个问题:假设我们有:a=8.1999999我们想将它四舍五入为2位小数,即8.20,然后乘以1,000,000得到8,200,000我们是这样做的;(a.round(2)*1000000).to_i但是我们得到的是8199999,为什么?奇怪的是,如果我们乘以1000、100000或10000000而不是1000000,我们会得到正确的结果。有人知道为什么吗?我们正在使用ruby1.9.2并尝试使用1.9.3。谢谢! 最佳答案 每当你在计算中得到时髦的数字时使用bigdecimalrequire'bi
我正在尝试为文件操作编写自己的DSL,只是为了学习。我的目标是让它易于理解和编码。这里有3种将字符串附加到database.yml的替代方法:1.append("windows").to("database.yml")2.append(string:"windows").to(file:"database.yml")3.append_string("windows").to_file("database.yml")4.append_string"windows",to_file:"database.yml"5.appendstring:"windows",to_file:"databa
所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。
一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cosαsinα0−sinαcosα]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx(α)= 1000cosα−sinα0sinαcosα绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cosα0−sinα010sinα0cosα]R_y(\alpha
欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋