我对这个 ARCore 很陌生,一直在看 SDK 中提供的 HelloAR Java Android Studio 项目。
一切正常并且非常酷,但是,即使没有检测到平面,我也想在触摸屏幕时放置/放下一个对象。让我解释得更好一些......
据我所知,ARCore 会检测水平面,并且只有在这些水平面上我才能放置 3D 对象以进行运动跟踪。
即使没有检测到水平面,是否有任何方法(可能使用 PointCloud 信息)能够将对象放置在场景中?有点像这些例子? https://experiments.withgoogle.com/ar/flight-paths https://experiments.withgoogle.com/ar/arcore-drawing
我知道他们正在使用 Unity 和 openFrameworks,但可以用 Java 完成吗?
另外,我看过 How to put an object in the air? 和 how to check ray intersection with object in ARCore
但我不认为我理解 Ancor 的概念(我设法将对象放在场景中,但它要么立即消失,要么只是一个对现实世界一无所知的普通 OpenGL 对象。
我想了解的是: - 如何以及是否可以创建自定义/用户定义的平面,即 ARCore 不会自动检测到的平面? - 如何创建一个不链接到任何平面或链接到某个 PointCloud 点的 Ancor(示例在 PlaneAttachment 类中执行,我认为)? - 如何绘制对象并将其放置在之前创建的 Ancor 上?
我觉得这个问题太多了,但是查看 API 文档对我一点帮助都没有
谢谢!
编辑:
这是我添加到 HelloArActivity.java 的代码(除//***** 之后和 ... 之前的行外,其他所有内容都与原始文件相同
@Override
public void onDrawFrame(GL10 gl) {
...
MotionEvent tap = mQueuedSingleTaps.poll();
// I added this to use screenPointToWorldRay function in the second link I posted... I am probably using this wrong
float[] worldXY = new float[6];
...
if (tap != null && frame.getTrackingState() == TrackingState.TRACKING) {
// ***** I added this to use screenPointToWorldRay function
worldXY = screenPointToWorldRay(tap.getX(), tap.getY(), frame);
...
}
...
// Visualize anchors created by touch.
float scaleFactor = 1.0f;
for (PlaneAttachment planeAttachment : mTouches) {
...
}
// ***** This places the object momentarily in the scene (it disappears immediately)
frame.getPose().compose(Pose.makeTranslation(worldXY[3], worldXY[4], worldXY[5])).toMatrix(mAnchorMatrix, 0);
// ***** This places the object in the middle of the scene but since it is not attached to anything, there is no tracking, it is always in the middle of the screen (pretty much expected behaviour)
// frame.getPose().compose(Pose.makeTranslation(0, 0, -1.0f)).toMatrix(mAnchorMatrix, 0);
// *****I duplicated this code which gets executed ONLY when touching a detected plane/surface.
mVirtualObject.updateModelMatrix(mAnchorMatrix, scaleFactor);
mVirtualObjectShadow.updateModelMatrix(mAnchorMatrix, scaleFactor);
mVirtualObject.draw(viewmtx, projmtx, lightIntensity);
mVirtualObjectShadow.draw(viewmtx, projmtx, lightIntensity);
...
}
最佳答案
您首先必须通过 Frame.hitTest 执行 HitTest 并遍历 HitResult 对象,直到您命中 Point 类型的 Trackable。然后,您可以通过 HitResult.getHitPose 检索该命中结果的姿势。 ,或将 anchor 附加到该点并通过 ArAnchor.getPose 从中获取姿势(最佳方法)。
但是,如果您想从使用 ArPointCloud.getPoints 检索到的仲裁点自己执行此操作,这将需要更多的工作。在这种方法中,问题有效地简化为“我怎样才能从一个点导出位姿/坐标基础?”。
从平面上工作时,推导姿势相对容易,因为您可以使用平面法线作为模型的向上 (y) vector ,并且可以选择 x 和 y vector 来配置您希望模型“面对”的位置“关于那架飞机。 (其中每个 vector 垂直于其他 vector )
当尝试从一个点推导出基时,您必须选择所有三个相对于您拥有的原点的 vector (x、y 和 z)。您可以使用 ArCamera.getViewMatrix 通过相机 View 矩阵(假设您希望模型的顶部面向屏幕顶部)转换 vector (0,1,0) 来导出向上 vector 。 .然后你可以选择 x 和 z vector 作为任何两个相互垂直的 vector ,将模型定向到你想要的方向。
关于java - 无需平面的 ARCore 对象跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46567257/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir