[英]Argon.js/A-Frame: local coordinates from getEntityPose() are not relative to refereceFrame
我正在尝试使用argon.js将lla坐标转换为来自预定义参考系的本地坐标。 向我推荐的方法(据我了解)要求我从一组lla中创建一个铯实体,然后在与其他lla中创建后续铯实体时使用该铯实体作为参考。
我尝试使用两种方法来执行此操作:第一种方法是在argon.js中创建参考铯实体,第二种方法是使用geopose创建a框架实体,然后从a框架实体的列表中获取铯实体。组件。 我使用argon.js进行所有后续转换。
在这两种方法中,我都成功创建了参考铯实体,并且(至少在我看来)转换后的铯实体包括参考实体作为其参考框架。 但是,转换后的实体的entityPose仍然为0、0、0。我的期望是参考实体将为0、0、0,并且转换后的实体将具有相对于该坐标的局部坐标(例如4、8、10) 。 此外,在每种情况下,实体的poseStatus均为0,但argon.js文档仅列出了可能性,例如KNOWN = 1,FOUND = 2和LOST = 4。
我在下面包括了我的代码以及检查员的一些反馈。 返回的对象非常大,因此我只包含了我认为相关的内容,但是请告知我是否应该包含其他属性。 还要注意,代码包含上面列出的两个选项,第二个选项已被注释掉。
有关一些历史记录,请参见:
<!DOCTYPE html>
<html>
<head>
<title>Hello world</title>
<script src="/socket.io/socket.io.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/geolocator/2.1.0/geolocator.js"></script>
<script src="arframe/main/resources/js/aframe.js"></script>
<script src="arframe/main/resources/js/argon.min.js"></script>
<script src="arframe/main/build.js"></script>
<script src="arframe/main/resources/js/CSS3DArgonRenderer.js"></script>
<script src="arframe/main/resources/js/CSS3DArgonHUD.js"></script>
<script src="arframe/main/resources/js/aframe-look-at-component.js"></script>
</head>
<body>
<h1>Hello world</h1>
<ar-scene>
<!--OPTION 2-->
<!-- <a-entity id='madRefFrame' referenceframe='lla: -84.31169 33.756128'></a-entity> -->
</ar-scene>
<script>
// OPTION 1
var app = Argon.init();
// OPTION 2
//var scene = document.querySelector('ar-scene');
//var app = scene.argonApp;
var Cesium = Argon.Cesium;
var Cartesian3 = Cesium.Cartesian3;
var ConstantPositionProperty = Cesium.ConstantPositionProperty;
var ReferenceFrame = Cesium.ReferenceFrame;
var ReferenceEntity = Cesium.ReferenceEntity;
app.context.setDefaultReferenceFrame(app.context.localOriginEastUpSouth);
app.updateEvent.addEventListener(function (frame) {
if (Argon.PoseStatus.KNOWN) {
// OPTION 1
var madRefData = { lla : { x : -84.31169, y : 33.756128, z : 299 }};
var madRef = Cartesian3.fromDegrees(madRefData.lla.x, madRefData.lla.y, madRefData.lla.z);
var options = { position: new ConstantPositionProperty(madRef, ReferenceFrame.FIXED),
orientation: Cesium.Quaternion.IDENTITY
};
var madRefEntity = new Cesium.Entity(options);
console.log('madRefEntity');
console.log(madRefEntity);
var madRefEntityPose = app.context.getEntityPose(madRefEntity);
console.log('madRefEntityPose');
console.log(madRefEntityPose);
// OPTION 2
// var madRefEL = document.querySelector('#madRefFrame');
// var madRefFrame = madRefEL.components['referenceframe'];
// var madRefEntity = madRefFrame.cesiumEntity;
//
// console.log('madRefEntity');
// console.log(madRefEntity);
//
// var madRefEntityPose = app.context.getEntityPose(madP1Entity);
//
// console.log('madRefEntityPose');
// console.log(madRefEntityPose);
// USED IN OPTIONS 1 AND 2
var madP1Data = { lla : { x : -84.31169, y : 33.755602, z : 297 }};
var madP1Ref = Cartesian3.fromDegrees(madP1Data.lla.x, madP1Data.lla.y, madP1Data.lla.z);
var options = { position: new ConstantPositionProperty(madP1Ref, madRefEntity),
orientation: Cesium.Quaternion.IDENTITY
};
var madP1Entity = new Cesium.Entity(options);
console.log('madP1Entity');
console.log(madP1Entity);
var madP1EntityPose = app.context.getEntityPose(madP1Entity);
console.log('madP1EntityPose');
console.log(madP1EntityPose);
} else {
// if we don't know the user pose we can't do anything
console.log("we don't know.");
return;
};
});
</script>
</body>
</html>
检查员的反馈:
A-Frame Version: 0.3.2
three Version: ^0.76.1
WebVR Polyfill Version: 0.9.15
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]}
THREE.CSS3DArgonRenderer 76CSS3D
THREE.CSS3DArgonHUD 76CSS3D
THREE.WebGLRenderer 76
Reality changed to: {"uri":"reality:empty","title":"Reality","providedReferenceFrames":["FIXED"]}
reference frame changed to FOUND
madRefEntity
Object { _availability: undefined,
_id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008",
// METHOD 2
// _id: "madRefFrame"
_parent: undefined,
_propertyNames: Array[19],
...
_position:Object
_definitionChanged:Object
_referenceFrame:0
_value:Object
x:526169.6230387943
y:-5282445.040716821
z:3524154.8442182266
// METHOD 2
//x:526144.9834483624
//y:-5282197.673182507
//z:3523988.702129788
...
}
madRefEntityPose
Object { position : { x: 0, y: 0, z: 0 },
orientation: { w: 1, x: 0, y: 0, z: 0 },
time: {dayNumber: 2457689, secondsOfDay : 81280.139927485},
poseStatus: 0 }
madRefP1Entity
Object { _availability: undefined,
_id: "9ded96ab-961c-4ba3-b766-8c37e919877f",
...
_parent: undefined,
_position: object
_referenceFrame: object
_id: "ae5fe824-12ea-4d7f-87e8-0eee0ca31008",
// METHOD 2
// _id: "madRefFrame"
_orientation: object
_value: Object
_w: 1,
_x: 0,
_y: 0
_z: 0
...
_position: Object
_value:Object
x:526169.6230387943
y:-5282445.040716821
z:3524154.8442182266
// METHOD 2
//x:526144.9834483624
//y:-5282197.673182507
//z:3523988.702129788
...
...
...
_value:Object
x:526172.6715934229
y:-5282475.646478866
z:3524105.2236363157
...
}
madRefEntityPose
madRefEntityPose = { position : { x: 0, y: 0, z: 0 },
orientation: { w: 1, x: 0, y: 0, z: 0 },
time: {dayNumber: 2457689, secondsOfDay : 81281.12722016001},
poseStatus: 0 }
首先,一些简单的事情。 要回答有关Argon.PoseStatus
的问题,它是一个位掩码,因此0暗含“以上都不存在”(因此,未知,不只是被发现或丢失)。 已知姿势时设置为KNOWN,当状态仅在KNOWN和KNOWN之间改变时,设置LOST或FOUND。
因此,你的线
if (Argon.PoseStatus.KNOWN) {
需要更改为
if (userPose.poseStatus & Argon.PoseStatus.KNOWN) {
如果要确保我们知道用户所在的位置,并且要在本地坐标中进行操作,则需要该位置。
就是说,由于尚未确定用户的位置, madRefEntityPose
可能尚未被计算(其poseStatus
为0)。 对于这两种选择。
现在,关于代码。 选项1为您提供了FIXED坐标中的实体(那些大数可能是正确的,它们是以地球的标准椭圆近似值为0的高度表示该点在地球表面上的位置的米值)。 如果用户的姿势是众所周知的,我期望poseStatus
被KNOWN
,和值position
和orientation
是什么非零。
选项2有点奇怪。 您要给它一个大数字作为实体的位置,但是要说它们是在前一个实体的坐标中表示的。 这意味着您可能正在告诉它将第二个实体放置在外层空间中,其距离等于到地球中心的距离...
我记得您的目标是获得相对于第一个点的第二个点的姿势。 为此,您需要
madP1Ref
)。 madP1Ref
一样,使用这些小仪表(现在在madP1Ref
)创建一个实体(如选项2中madP1Ref
)。 据我了解,问题在于,尽管桌面浏览器会提供位置,但由于无法提供方向,所以无法获得完整的3D姿势。 因此,针对任意参考系定义了用户实体。 将来的发行版将以一种不可用的方式进行定位。
编辑:问题的性质错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.