如何始终将物体放在相机前
How to place an object in front of camera always
我正在制作一个应用程序,因为我正在渲染 360 度图像,我想在相机前添加一个对象或十字线,即(广告牌概念)。
所以我已经厌倦了堆栈溢出本身的很多事情,但我不知道我该怎么做,下面是我正在尝试做的代码。
Vector3 position;
float[] newPosition4 = new float[4];
position = obj.getPosition();
float[] posVec4 = {0, 0, -8, 0.0f};
float[] HeadViewMatrix_inv = new float[16];
Matrix4 HeadViewMatrix4 = new Matrix4();
HeadViewMatrix4.setAll(getCurrentCamera().getViewMatrix());
HeadViewMatrix4 = HeadViewMatrix4.inverse();
//Copy matrix to HeadViewMatrix array,
HeadViewMatrix4.toFloatArray(HeadViewMatrix_inv);
//Translation of viewMatrix
Matrix.multiplyMV(newPosition4, 0, HeadViewMatrix_inv, 0, posVec4, 0);
obj.setPosition(newPosition4[0], newPosition4[1], newPosition4[2]);
所以任何人都可以帮助我解决这个问题。
如果我理解您的要求,这几乎是最简单的事情。您需要构建一个新矩阵或简单地删除当前矩阵(使用标识)。
通过从 A(-0.5, 0.0, 0.0)
到 B(0.5, 0.0, 0.0)
画一条线来识别,将在屏幕中间画一条垂直直线。这将占用一半的屏幕尺寸并居中。
我建议您使用具有屏幕坐标的正交投影矩阵,并将您的对象放在中间,就像您在另一个具有恒定大小的视图(width/2
、height/2
)中一样。
但是如果你想让它始终可见,请确保在绘制此元素时禁用深度缓冲区。
如果出于某种原因你想使用平截头矩阵将物体保持在你面前,甚至可能保持深度测试,那么你只需要保持相同的投影矩阵(平截头部分)并将视图矩阵设置为恒等(来自相机的那个)。设置好这些后,您需要做的就是将对象放在绝对零 (.0f, .0f, distanceToObject)
.
前面
如果你想使用canvas,我可以提供一个简单的解决方案。
<RelativeLayout
android:id="@+id/layout_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- Camera Preview -->
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
将 SurfaceView 和 Canvas 添加到此 FrameLayout 并在其中绘制任何您想要的内容 canvas。
我正在制作一个应用程序,因为我正在渲染 360 度图像,我想在相机前添加一个对象或十字线,即(广告牌概念)。
所以我已经厌倦了堆栈溢出本身的很多事情,但我不知道我该怎么做,下面是我正在尝试做的代码。
Vector3 position;
float[] newPosition4 = new float[4];
position = obj.getPosition();
float[] posVec4 = {0, 0, -8, 0.0f};
float[] HeadViewMatrix_inv = new float[16];
Matrix4 HeadViewMatrix4 = new Matrix4();
HeadViewMatrix4.setAll(getCurrentCamera().getViewMatrix());
HeadViewMatrix4 = HeadViewMatrix4.inverse();
//Copy matrix to HeadViewMatrix array,
HeadViewMatrix4.toFloatArray(HeadViewMatrix_inv);
//Translation of viewMatrix
Matrix.multiplyMV(newPosition4, 0, HeadViewMatrix_inv, 0, posVec4, 0);
obj.setPosition(newPosition4[0], newPosition4[1], newPosition4[2]);
所以任何人都可以帮助我解决这个问题。
如果我理解您的要求,这几乎是最简单的事情。您需要构建一个新矩阵或简单地删除当前矩阵(使用标识)。
通过从 A(-0.5, 0.0, 0.0)
到 B(0.5, 0.0, 0.0)
画一条线来识别,将在屏幕中间画一条垂直直线。这将占用一半的屏幕尺寸并居中。
我建议您使用具有屏幕坐标的正交投影矩阵,并将您的对象放在中间,就像您在另一个具有恒定大小的视图(width/2
、height/2
)中一样。
但是如果你想让它始终可见,请确保在绘制此元素时禁用深度缓冲区。
如果出于某种原因你想使用平截头矩阵将物体保持在你面前,甚至可能保持深度测试,那么你只需要保持相同的投影矩阵(平截头部分)并将视图矩阵设置为恒等(来自相机的那个)。设置好这些后,您需要做的就是将对象放在绝对零 (.0f, .0f, distanceToObject)
.
如果你想使用canvas,我可以提供一个简单的解决方案。
<RelativeLayout
android:id="@+id/layout_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!-- Camera Preview -->
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
将 SurfaceView 和 Canvas 添加到此 FrameLayout 并在其中绘制任何您想要的内容 canvas。