- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过简单地使用一个 fragment 的提要并将另一个屏幕元素设置为相同的内容来在屏幕上显示一个 arFragment 两次,但我无法弄清楚要采用哪个元素。
我知道,我通过调用获取当前的Camera图像
ArFragment arFragment = (ArFragment) getSupportFragmentManager()
.findFragmentById(R.id.arFragment);
Image image = arFragment.getArSceneView().getArFrame().acquireCameraImage();
但我不知道如何获取另一个屏幕对象并将 View 设置为提要,arFragment 给了我。例如:
TextureView secondView = (TextureView) findViewById(R.id.texture);
secondView.setSurfaceTexture((SurfaceTexture) image);
产生不可转换的类型错误。
我无法使用另一个 arFragment,因为那样会分配另一个相机(显然会产生黑屏和“相机已在使用”错误)。我还没找到
arFrame.assignCamera();
方法,这并不重要,因为Fragment使用的相机只是一个对象,而不是真实的东西。但我无法弄清楚硬件与 fragment 的联系在哪里。如果我没记错的话,我无法在那里读写。
我可以将 feed 转换为位图,或者将其放置到 imageView 上,但我有点害怕每秒执行 60 次。必须有一个简单的解决方案,对吧?...
显示 View 两次并不难 -.-
最佳答案
好的,明白了。转换为 bmp 有点神奇,但我猜确实没有直接的方法。
所以我初始化了一个bytebuffer,分析了android.media.image的YUV分量,将它们转换为Jpeg,然后将其更改为Bitmap,将其旋转90°以匹配原始图片。
// get the arFragment
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
ArSceneView arSceneView = arFragment.getArSceneView();
// set up a Listener to trigger on every frame
arSceneView.getScene().addOnUpdateListener(frameTime ->
{
try
{
frame = arSceneView.getArFrame();
androidMediaImage = frame.acquireCameraImage();
int imageWidth = androidMediaImage.getWidth();
int imageHeight = androidMediaImage.getHeight();
// select the target Container to display the image in
ImageView secondView = (ImageView) findViewById(R.id.imageView3);
byte[] nv21;
// an Android.Media.Image is a YUV-Image which is made out of 3 planes
ByteBuffer yBuffer = androidMediaImage.getPlanes()[0].getBuffer();
ByteBuffer uBuffer = androidMediaImage.getPlanes()[1].getBuffer();
ByteBuffer vBuffer = androidMediaImage.getPlanes()[2].getBuffer();
// set up a Bytearray with the size of all the planes
int ySize = yBuffer.remaining();
int uSize = uBuffer.remaining();
int vSize = vBuffer.remaining();
nv21 = new byte[ySize + uSize + vSize];
// Fill in the array. This code is directly taken from https://www.programcreek.com
//where it was pointed out that U and V have to be swapped
yBuffer.get(nv21, 0 , ySize);
vBuffer.get(nv21, ySize, vSize);
vBuffer.get(nv21, ySize + vSize, uSize);
// combine the three layers to one nv21 image
YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, imageWidth, imageHeight, null);
// Open a Bytestream to feed the compressor
ByteArrayOutputStream out = new ByteArrayOutputStream();
// compress the yuv image to Jpeg. This is important, because the BitmapFactory can't read a
// yuv-coded image directly (belief me I tried -.-)
yuvImage.compressToJpeg(new Rect(0, 0, imageWidth, imageHeight), 50, out);
// now write down the bytes of the image into an array
byte[] imageBytes = out.toByteArray();
// and build the bitmap using the Factory
Bitmap bitmapImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
// use a Matrix for the rotation
Matrix rotationMatrix = new Matrix();
// the thing is basically a bunch of numbers which then can be used to compute the new location of each pixel
rotationMatrix.postRotate(90);
// the rotatedImage will be our target image
Bitmap rotatedImage = Bitmap.createBitmap(bitmapImage, 0,0, bitmapImage.getWidth(), bitmapImage.getHeight(), rotationMatrix, true);
// it's so easy!!!!
secondView.setImageBitmap(rotatedImage);
} catch (NotYetAviableException e)
{
e.printStackTrace();
}
});
如果我完全错了,你显然可以纠正我,并且有一个更简单的解决方案。但至少它有效,所以我很高兴<3
关于java - 在另一个屏幕元素上设置 ARCore Sceneview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53612633/
我正在阅读下面的代码。 https://github.com/tukuyo/rakumaruCardMan/blob/master/rakutencard-Man/ViewController.swi
我正在构建一个自定义窗口,我正在尝试重用 Unity 的场景 View ,以便能够直接从此特定窗口进行绘制。 我设法通过扩展 UnityEditor.SceneView 来重现正确的窗口,这就是我所拥
我已经使用 SceneView 加载 3D 模型将近一年了,但我一直不明白是什么导致了这种泄漏。我会实现 LeakCanary,但只有这一次泄漏,因为我不知道如何解决这个问题。 但现在我想弄清问题的根
我想打开一个 3D 模型并使其背景透明,以便我可以看到 SceneView 后面的 UI。我试过这段代码,但sceneView变成白色,不透明。 struct ModelView: View {
我正在加快 ArcGIS JS Api 版本 4.x 的运行速度,并认为这是在 Typescript 和 Widget 架构上实现一个显示 SceneView 的小部件的一个很好的练习。在当前 Map
您对此有什么解决方案吗? 我想得到 SC.SceneView从下到上过渡,而不是从左到右或从右到左。 Doc在这里并没有说太多,但是由于原始转换必须在某个地方,也许我可以为此创建其方法的原型(prot
我试图通过简单地使用一个 fragment 的提要并将另一个屏幕元素设置为相同的内容来在屏幕上显示一个 arFragment 两次,但我无法弄清楚要采用哪个元素。 我知道,我通过调用获取当前的Came
使用scene.isPaused和sceneView.isPlaying有什么区别?这些只是从不同地方处理的相同事情吗?是否将其中一个更改为 true,将其他更改为 false,反之亦然? 最佳答案
我有一个位于 SCNVector3.zero 的地球仪,带有 OrbitTurntable/allowsCameraControl 和一个使用 SCNLookAtConstraint 来观察地球仪的相
我想获取场景 View 中特定特征点处检测到的世界对象的颜色。例如,我在 (x:10, y:10, z:10) 处检测到一个特征点。 如何获取此位置的object/surface的颜色? 最佳答案 目
我不明白为什么我的代码不能运行其他设备,而我的代码在我的旧设备中检查正常。这是通知: Invariant Violation: Invariant Violation: Element type is
我正在学习 ARKit。我在增强现实场景中放置虚拟对象并在这些问题上苦苦挣扎! I am using this demo project from github 1- 如何在 SceneKit 的 S
我在空间中有两个点,并且想要一个第三个 点,它是前两个点的某个乘数的延伸 - 延伸线段。我将如何在 Swift4 中执行此操作 - 我将如何获得下面的 x2、y2、z2? distance
我正在研究 ARKit,这是我的开始。我添加了 3D 模型以显示在我的 ARSCNView 上。我正在学习本教程:https://www.appcoda.com/arkit-3d-object/ 我使
在 Apple 的 ARKitExample 中,如果我在一个场景 View 中添加多个虚拟对象(两把椅子)。如何在 ARKitExample 的 sceneView 中检测我触摸了哪把椅子? sce
有人知道如何更改 SceneView 对象的背景颜色吗?我正在尝试将背景属性放置到 SceneView,但它并没有改变它,仍然具有默认背景。 In this case I wanted to the
如何旋转使用 ARCORE SceneView 渲染的 3d 模型我已经使用了 Sceneview 私有(private) lateinit var 场景:场景 私有(private) lateini
我正在尝试设置一个布局,其中 map 放置在 SceneView 的顶部。当应用程序构建时,设置会闪烁一秒钟,然后 SceneView 占据整个屏幕,完全隐藏其他两个 View 。 在左侧菜单上移动
我正在从事一个项目,该项目将在一个 fragment 中包含一个 3D 模型查看器。为此,我决定使用 sceneform。尝试在我的选项卡 fragment 中显示 SceneView 后,我遇到了问
我想在没有相机和 ArCore 的场景 View 上加载 3D 对象。所以我创建了一个简单的 xml 布局,如下所示: 并像这样加载 3D 对象: private fun rend
我是一名优秀的程序员,十分优秀!