我们计划为Google StreetView创建Google Cardboard体验.谷歌已经公开了谷歌街景API,以根据位置和角度获取图像.如果我使用此API,我需要根据用户头部移动来拼接图像.用户可以水平360度,垂直180度观看物体.如何基于StreetView API实现此功能以及我需要多长时间才能发出请求以及组合图像的最佳方式是什么.有没有什么办法可以直接在com.google.vrtoolkit.cardboard.CardboardView中使用"com.google.android.gms.maps.StreetViewPanoramaView"?感谢提前..
我正在使用gstreamer检索视频源(从RaspPi发送),我需要将其显示在Google Cardboard中.
我的工作基于gstreamer的tutorial-3示例.我设法将我的视频显示到SurfaceView中,通过提供我的Surface(从中检索SurfaceView.SurfaceHolder.getSurface()
,但我现在需要将其与Google Cardboard连接).
如果我没有弄错,Google Cardboard依赖于某些SurfaceTexture.所以我认为使用Surface(SurfaceTexture)
构造函数从SurfaceTexture中简单地获取Surface会很容易.
问题是它根本不起作用.我的Google纸板应用程序Cardboard Pasthrough示例,我还没有触及OpenGL代码,因为我对此一无所知.
在调试时,我发现我正在使用的代码存在(至少)一个问题.看来就行了
GLES20.glActiveTexture(GL_TEXTURE_EXTERNAL_OES);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
Run Code Online (Sandbox Code Playgroud)
由于GL_TEXTURE_EXTERNAL_OES
不在glActiveTexture
方法的所需范围内(需要GL从0到GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
),因此给我带来了一些麻烦.这是我的日志:
GLConsumer W [unnamed-12520-0] bindTextureImage: clearing GL error: 0x500
Adreno-ES20 W <core_glActiveTexture:348>: GL_INVALID_ENUM
Run Code Online (Sandbox Code Playgroud)
那么现在有什么用呢?
似乎gstreamer接收了视频源,它尝试更新Surface(我得到一些关于onFrameAvailable
正在更新的SurfaceTexture的通知,并且只在那里发送错误日志).但是,屏幕保持黑色,好像什么都没有更新.
以下是我的代码中最有趣的部分:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CardboardView cardboardView = (CardboardView) findViewById(R.id.cardboard_view);
cardboardView.setRenderer(this);
setCardboardView(cardboardView);
// Initialize GStreamer and warn if it fails
try {
GStreamer.init(this);
} catch (Exception e) {
//Catch e...
} …
Run Code Online (Sandbox Code Playgroud) 在我的Android Cardboard应用程序中,我希望在每个眼睛中心显示一个叠加.简单地创建一个具有两个居中视图的LinearLayout非常简单,适用于大多数手机,因为眼睛最适合:
如果情况并非如此,那么让每个眼睛的中心成为一个问题.使用平板电脑时最清楚地说明了这一点:
我试图在每个眼睛视图中居中显示消息"缓冲,0%......".
眼睛的渲染框的大小具有固定的尺寸(当然,因为人眼之间的距离具有相当固定的尺寸).不幸的是,CardboardView似乎没有提供有关眼睛的确切大小和/或位置的信息.
我已经研究过获得左眼和右眼cardboardView.getCurrentEyeParams()
(奇怪的未记录),每个眼睛都包含一个视口.这似乎给出了大小和位置,但其值似乎与屏幕上的大小和位置没有直接关系.
在屏幕分辨率为1920×1080的LG G2上,视口为:
Viewport left: {
x: 0,
y: 0,
width: 1150,
height: 1177,
}
Viewport right: {
x: 1150,
y: 0,
width: 1150,
height: 1177,
}
Run Code Online (Sandbox Code Playgroud)
在屏幕分辨率为2048×1536的Nexus 9上,视口为:
Viewport left: {
x: 0,
y: 0,
width: 802,
height: 802,
}
Viewport right: {
x: 802,
y: 0,
width: 802,
height: 802,
}
Run Code Online (Sandbox Code Playgroud)
这两个尺寸(如果它们以像素为单位)比显示的实际图像大得多,并且在LG G2的情况下,宽度和高度确实大于1080px的屏幕尺寸.
看一下Cardboard SDK的一些反编译代码,看来眼睛周围的渐晕方形是通过一个名为DistortionMesh的内部类绘制的,并通过一些有些复杂的代码呈现.(注意,通过反编译似乎缺少某些逻辑,例如第195和199行.)
Viewport的创建表明这些值确实是像素(以米为单位的偏移量乘以每米的像素数).也许DistortionMesh或EyeView矩阵在渲染之前应用于视口?无论如何,我觉得我没有找对地方.
我还看了一下获取ScreenParams,因为它也提供了宽度和高度.不幸的是,这会返回两个设备上的整个屏幕尺寸,但似乎并不相关.
我当前的方法叠加是一个自定义ViewGroup,它通过child.layout()
使用ScreenParams的高度和宽度的一半来调用两个孩子.
我怎样才能知道Eye被吸引到StereoRenderer的大小?我可以找到一种不同的方式来将眼睛中的不同视图居中吗?
我是这个地区的新人.我正在尝试更改github中的程序,以便现在播放纸板视频.
我使用StreamingTexture修改了MyRenderer.
public class MyRenderer extends RajawaliCardboardRenderer {
public MyRenderer(Context context) {
super(context);
}
private MediaPlayer mMediaPlayer;
private StreamingTexture streamingTexture;
@Override
protected void initScene() {
mMediaPlayer = MediaPlayer.create(this.getContext(), R.raw.test);
streamingTexture = new StreamingTexture("video", mMediaPlayer);
Sphere sphere = createPhotoSphereWithTexture(streamingTexture);
getCurrentScene().addChild(sphere);
getCurrentCamera().setPosition(Vector3.ZERO);
getCurrentCamera().setFieldOfView(75);
}
private static Sphere createPhotoSphereWithTexture(ATexture texture) {
Material material = new Material();
material.setColor(0);
try {
material.addTexture(texture);
} catch (ATexture.TextureException e) {
throw new RuntimeException(e);
}
Sphere sphere = new Sphere(50, 64, 32);
sphere.setScaleX(-1);
sphere.setMaterial(material);
return sphere;
} …
Run Code Online (Sandbox Code Playgroud) 我在Stack Overflow中的第一条消息如果我不是100%与规则一致,那么道歉.在这里和谷歌搜索没有任何运气.
如何更改眼睛之间的Google Cardboard Unity预制距离.我有一个眼睛紧张经验,相机看起来太近或太公鸡眼睛(面向内)但游戏对象的任何调整在播放时被重新设置,我无法从脚本中找到正确的代码行.
谢谢.
现在,我认为在Unity中没有办法做到这一点.这是我到目前为止所发现的(如果我错了,请纠正我):
与Android和iPhone兼容的最流行的VR插件是Durovis Dive SDK和Google Cardboard SDK.
我已经读过大多数Android手机都与那些VR插件兼容.我的经验是只有少数兼容.Durovis Dive SDK似乎是当今最兼容的SDK.如果Android手机没有陀螺仪且游戏中有Google Cardboard SDK插件,游戏将无法加载或崩溃.如果Android手机没有陀螺仪,游戏将加载但是当我们移动手机时图像仍然是静止的.
Unity 5.3刚刚发布.它包括WebGL支持.它包括VR支持.支持Samsung Gear和Occulus.但是,我还没有发现与其他Android或iPhone设备的兼容性.也许它有效(我没有测试过.我还没有找到测试它的人).
我们可以找到将Unity场景导出到Three.js的内容.脚本和动画似乎不起作用.
unity-game-engine webgl three.js google-cardboard virtual-reality
我试图找出是否可以通过参数或通过API调用某些YouTube 360视频的双眼分割视图的"VR模式" ?
现在,当我在iPhone上播放#360视频时,我可以360度移动,但是分割视图不是一个选项.
如果我在Android设备上执行相同的操作,我可以选择为Google Cardboard输入"splitview" .
是否可以从iPhone触发此拆分视图模式,或者如果#360视频嵌入带参数的网站或通过API?
我使用canvas和Unity UI元素作为HUD.我希望HUD能在所有事物面前,但事实并非如此.
我有一个使用 Cardboard SDK 构建的 Unity 场景,并导出为 Android 库。该库用于在 Android 应用程序上以纸板模式播放视频。它不是整个应用程序,而是其中的一部分。Android 应用程序的其余部分是使用 Kotlin 和 Java 构建的。
我已经实现了,所有功能都按预期工作,但是退出场景会使 android 崩溃。
我们尝试了各种方法来清除玩家首选项,甚至在关闭场景之前清除内存。但在安卓上总是崩溃。我有两部 Android 手机(Android 9 和 10)用于测试。
在 Android 应用程序中,我已经做到了,一旦应用程序崩溃,我就会尝试恢复。我的崩溃是一些lateinit var
变量被破坏了。它们的值变为 null 并且恢复先前的活动会使其崩溃。因此,在退出 Unity 场景后,我将取消引用的变量加载回内存中,一切都会恢复正常。
注意:我尝试过使用
Application.Quit();
unity,但它只是关闭了整个应用程序。另一方面,我只想关闭跑步场景
在统一中[我调用goBack
android部分中的一个函数来关闭应用程序]:
public void GoToHome()
{
Pause();
Stop();
Resources.UnloadUnusedAssets();
PlayerPrefs.DeleteAll();
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("goBack");
}
Run Code Online (Sandbox Code Playgroud)
在应用程序中:
public void goBack()
{
UnityPlayer.currentActivity.finish();
finish();
loadDerereferencedVars();
}
Run Code Online (Sandbox Code Playgroud)
这在 android 9 上完美运行。在另一部装有 android 10 的手机上,关闭场景后,应用程序继续运行,但是出现一条消息
当我单击关闭应用程序时,该应用程序继续工作。
我检查了日志,null pointer dereference …
java android unity-game-engine uncaught-exception google-cardboard
google-cardboard ×10
android ×5
video ×2
google-maps ×1
ios ×1
java ×1
opengl-es ×1
parameters ×1
rajawali ×1
three.js ×1
webgl ×1
xcode ×1
youtube ×1
youtube-api ×1