Google最新VR消息

google最近退出了Day-dream的SDK测试版,提供给开发者,我把google的sdk运行了一遍并结合官网的介绍算搞明白了一些api的调用。下面时Google的demo地址Day-dreamDemo


我们下载并且import到AS中


这里我们看到Google的demo中给了我们4个案例。供我们参考,其他的Libraries都是以arr的形式提供给我们。可以看出来Google的用心和信息。

需要注意的时:Google建议使用7.0系统 开启vr设置
当然我们依然可以使用低版本的系统(4.4以上为佳)


我们依次看每一个demo

  1. com.google.vr.samples.controllerclient
    手柄的控制demo



    我们清晰的看到OrientationView时自定义了一个GlsurfaceView的视图,ControllerClientActivity则时整个视图。

    • OrientationView的Code段
<code class="hljs java has-numbering"> <span class="hljs-keyword">public</span> <span class="hljs-title">OrientationView</span>(Context context, AttributeSet attributeSet) {<span class="hljs-keyword">super</span>(context, attributeSet);setEGLContextClientVersion(<span class="hljs-number">2</span>);setEGLConfigChooser(<span class="hljs-number">8</span>, <span class="hljs-number">8</span>, <span class="hljs-number">8</span>, <span class="hljs-number">8</span>, <span class="hljs-number">16</span>, <span class="hljs-number">0</span>);setRenderer(<span class="hljs-keyword">new</span> Renderer());sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);orientationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);phoneOrientationListener = <span class="hljs-keyword">new</span> PhoneOrientationListener();}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

这里是自定义控件的初始化,初始了GL2.0 并且设置了旋转传感器的监听。


private class Renderer implements GLSurfaceView.Renderer中最重要的对视图进行绘制矩阵

<code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span><span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDrawFrame</span>(GL10 unused) {GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);GLES20.glUseProgram(program);<span class="hljs-comment">// Set up camera.</span>Matrix.setIdentityM(tmpMatrix1, <span class="hljs-number">0</span>);<span class="hljs-comment">// Convert world space to head space.</span>Matrix.translateM(tmpMatrix1, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, -VIEW_SIZE);Matrix.multiplyMM(tmpMatrix2, <span class="hljs-number">0</span>, tmpMatrix1, <span class="hljs-number">0</span>, phoneInWorldSpaceMatrix, <span class="hljs-number">0</span>);<span class="hljs-comment">// Phone's Z faces up. We need it to face toward the user.</span>Matrix.rotateM(tmpMatrix2, <span class="hljs-number">0</span>, <span class="hljs-number">90</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);<span class="hljs-keyword">if</span> (startFromSensorTransformation != <span class="hljs-keyword">null</span>) {<span class="hljs-comment">// Compensate for the yaw by rotating in the other direction.</span>Matrix.rotateM(tmpMatrix2, <span class="hljs-number">0</span>, -startFromSensorTransformation[<span class="hljs-number">0</span>], <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>);} <span class="hljs-comment">// Else we're in a transient state between a resetYaw call and an onSensorChanged call.</span><span class="hljs-comment">// Convert object space to world space.</span><span class="hljs-keyword">if</span> (controller != <span class="hljs-keyword">null</span>) {controller.update();controller.orientation.toRotationMatrix(controllerInStartSpaceMatrix);}Matrix.multiplyMM(tmpMatrix1, <span class="hljs-number">0</span>, tmpMatrix2, <span class="hljs-number">0</span>, controllerInStartSpaceMatrix, <span class="hljs-number">0</span>);<span class="hljs-comment">// Set mvpMatrix.</span><span class="hljs-keyword">int</span> mvp = GLES20.glGetUniformLocation(program, <span class="hljs-string">"uMvpMatrix"</span>);Matrix.multiplyMM(mvpMatrix, <span class="hljs-number">0</span>, projectionMatrix, <span class="hljs-number">0</span>, tmpMatrix1, <span class="hljs-number">0</span>);GLES20.glUniformMatrix4fv(mvp, <span class="hljs-number">1</span>, <span class="hljs-keyword">false</span>, mvpMatrix, <span class="hljs-number">0</span>);<span class="hljs-comment">// Draw.</span><span class="hljs-keyword">int</span> position = GLES20.glGetAttribLocation(program, <span class="hljs-string">"aPosition"</span>);GLES20.glVertexAttribPointer(position, <span class="hljs-number">3</span>, GLES20.GL_FLOAT, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>, boxVertices);GLES20.glEnableVertexAttribArray(position);<span class="hljs-keyword">int</span> color = GLES20.glGetAttribLocation(program, <span class="hljs-string">"aColor"</span>);GLES20.glVertexAttribPointer(color, <span class="hljs-number">4</span>, GLES20.GL_FLOAT, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>, boxColors);GLES20.glEnableVertexAttribArray(color);GLES20.glDrawArrays(GLES20.GL_LINES, <span class="hljs-number">0</span>, vertexCount);GLES20.glDisableVertexAttribArray(position);GLES20.glDisableVertexAttribArray(color);}}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li></ul>

2 . com.google.vr.sdk.samples.simplepanowidget
panorama(全景图片)沉溺demo

<code class="hljs avrasm has-numbering">  @Overrideprotected void onCreate(Bundle savedInstanceState) {super<span class="hljs-preprocessor">.onCreate</span>(savedInstanceState)<span class="hljs-comment">;</span>setContentView(R<span class="hljs-preprocessor">.layout</span><span class="hljs-preprocessor">.main</span>_layout)<span class="hljs-comment">;</span>// Make the source link clickable.TextView sourceText = (TextView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.source</span>)<span class="hljs-comment">;</span>sourceText<span class="hljs-preprocessor">.setText</span>(Html<span class="hljs-preprocessor">.fromHtml</span>(getString(R<span class="hljs-preprocessor">.string</span><span class="hljs-preprocessor">.source</span>)))<span class="hljs-comment">;</span>sourceText<span class="hljs-preprocessor">.setMovementMethod</span>(LinkMovementMethod<span class="hljs-preprocessor">.getInstance</span>())<span class="hljs-comment">;</span>panoWidgetView = (VrPanoramaView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.pano</span>_view)<span class="hljs-comment">;</span>panoWidgetView<span class="hljs-preprocessor">.setEventListener</span>(new ActivityEventListener())<span class="hljs-comment">;</span>// Initial launch of the app <span class="hljs-keyword">or</span> an Activity recreation due to rotation.handleIntent(getIntent())<span class="hljs-comment">;</span>}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>

以上我们可以看到初始话控件,以及设置一些事件的监听。(最重要的是学习到了新的知识(让Activity可以getIntent())

<code class="hljs java has-numbering"><span class="hljs-javadoc">/*** Called when the Activity is already running and it's given a new intent.*/</span><span class="hljs-annotation">@Override</span><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNewIntent</span>(Intent intent) {Log.i(TAG, <span class="hljs-keyword">this</span>.hashCode() + <span class="hljs-string">".onNewIntent()"</span>);<span class="hljs-comment">// Save the intent. This allows the getIntent() call in onCreate() to use this new Intent during</span><span class="hljs-comment">// future invocations.</span>setIntent(intent);<span class="hljs-comment">// Load the new image.</span>handleIntent(intent);}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

其中handleIntent的方法内写了一些引用图片的代码段(并不重要,不再展示)

再AsyTask中我看到了一个让我感觉很重要的东西

<code class="hljs mathematica has-numbering">  panoOptions = new <span class="hljs-keyword">Options</span>();panoOptions.inputType = <span class="hljs-keyword">Options</span>.TYPE_STEREO_OVER_UNDER;</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>

Options 具有两个public常量

范围 名称
public TYPE_MONO(单独全景图片时使用) 1
public TYPE_STEREO_OVER_UNDER(全景图片拼接为上下两部分时候使用) 2
private TYPE_START_MARKER 0
private TYPE_END_MARKER 3

2中不同模式比较
* TYPE_MONO模式下
* TYPE_STEREO_OVER_UNDER模式下


3 . com.google.vr.sdk.samples.simplevideowidget
最关注的莫过于 VR的音频播放了。在了解前,我们需要看一下Google告诉我们如何导入比如MP3,HlS等音频的操作。

<code class="hljs applescript has-numbering">/*** A test activity <span class="hljs-keyword">that</span> renders a <span class="hljs-number">360</span> video using {@link VrVideoView}.* It loads <span class="hljs-keyword">the</span> video <span class="hljs-keyword">in</span> <span class="hljs-keyword">the</span> assets <span class="hljs-keyword">by</span> default. User can use <span class="hljs-keyword">it</span> <span class="hljs-keyword">to</span> load any video files using <span class="hljs-keyword">the</span>* command:*   adb shell am start -a android.intent.action.VIEW \*     -n com.google.vr.sdk.samples.simplevideowidget/.SimpleVrVideoActivity \*     -d /sdcard/FILENAME.MP4** To load HLS urls add <span class="hljs-string">"--ei inputFormat 2"</span> <span class="hljs-keyword">to</span> pass <span class="hljs-keyword">in</span> an <span class="hljs-type">integer</span> extra which will <span class="hljs-keyword">set</span>* VrVideoView.Options.inputFormat. e.g.*   adb shell am start -a android.intent.action.VIEW \*     -n com.google.vr.sdk.samples.simplevideowidget/.SimpleVrVideoActivity \*     -d <span class="hljs-string">"https://EXAMPLE.COM/FILENAME.M3U8"</span> \*     <span class="hljs-comment">--ei inputFormat 2</span>** To specify <span class="hljs-keyword">that</span> <span class="hljs-keyword">the</span> video <span class="hljs-keyword">is</span> <span class="hljs-keyword">of</span> type stereo <span class="hljs-keyword">over</span> under (has images <span class="hljs-keyword">for</span> left <span class="hljs-keyword">and</span> right eyes),* add <span class="hljs-string">"--ei inputType 2"</span> <span class="hljs-keyword">to</span> pass <span class="hljs-keyword">in</span> an <span class="hljs-type">integer</span> extra which will <span class="hljs-keyword">set</span> VrVideoView.Options.inputType.* This can be combined <span class="hljs-keyword">with</span> other extras.* e.g.*   adb shell am start -a android.intent.action.VIEW \*     -n com.google.vr.sdk.samples.simplevideowidget/.SimpleVrVideoActivity \*     -d <span class="hljs-string">"https://EXAMPLE.COM/FILENAME.MP4"</span> \*     <span class="hljs-comment">--ei inputType 2</span>*/</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>

在我们导入前,我们需要了解视频的格式以及是否双眼等选择对应的类型,使用adb导入到手机的内存中。

<code class="hljs cs has-numbering"> <span class="hljs-comment">// Bind input and output objects for the view.</span>videoWidgetView = (VrVideoView) findViewById(R.id.video_view); <span class="hljs-comment">//VR视频控件VrVideoView</span>videoWidgetView.setEventListener(<span class="hljs-keyword">new</span> ActivityEventListener());  <span class="hljs-comment">//设置视频的回掉(处理进度条等)</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

可以看到视频VR视频播放控件的初始化,和设置监听事件。

<code class="hljs mathematica has-numbering">    <span class="hljs-keyword">Options</span> options = new <span class="hljs-keyword">Options</span>();options.inputType = <span class="hljs-keyword">Options</span>.TYPE_STEREO_OVER_UNDER;</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>


这里的模式和全景图片类似,不过注意多出来的几个Public属性,为音频的格式Default还是Hls.


4 .com.google.vr.sdk.samples.treasurehunt

首先我们先看一下目录结构:
|-TreasureHuntActivity (主要的实现类)
|-WorldLayoutData (主要是需要渲染的视图矩阵坐标)

TreasureHuntActivity的code

我们需要初始化3D音效

<code class="hljs cs has-numbering">    <span class="hljs-comment">// Initialize 3D audio engine.</span>gvrAudioEngine = <span class="hljs-keyword">new</span> GvrAudioEngine(<span class="hljs-keyword">this</span>, GvrAudioEngine.RenderingMode.BINAURAL_HIGH_QUALITY);</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>

画地板的Gl代码段

<code class="hljs java has-numbering"><span class="hljs-javadoc">/*** Draw the floor.** <p>This feeds in data for the floor into the shader. Note that this doesn't feed in data about* position of the light, so if we rewrite our code to draw the floor first, the lighting might* look strange.*/</span><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">drawFloor</span>() {GLES20.glUseProgram(floorProgram);<span class="hljs-comment">// Set ModelView, MVP, position, normals, and color.</span>GLES20.glUniform3fv(floorLightPosParam, <span class="hljs-number">1</span>, lightPosInEyeSpace, <span class="hljs-number">0</span>);GLES20.glUniformMatrix4fv(floorModelParam, <span class="hljs-number">1</span>, <span class="hljs-keyword">false</span>, modelFloor, <span class="hljs-number">0</span>);GLES20.glUniformMatrix4fv(floorModelViewParam, <span class="hljs-number">1</span>, <span class="hljs-keyword">false</span>, modelView, <span class="hljs-number">0</span>);GLES20.glUniformMatrix4fv(floorModelViewProjectionParam, <span class="hljs-number">1</span>, <span class="hljs-keyword">false</span>, modelViewProjection, <span class="hljs-number">0</span>);GLES20.glVertexAttribPointer(floorPositionParam, COORDS_PER_VERTEX, GLES20.GL_FLOAT, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>, floorVertices);GLES20.glVertexAttribPointer(floorNormalParam, <span class="hljs-number">3</span>, GLES20.GL_FLOAT, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>, floorNormals);GLES20.glVertexAttribPointer(floorColorParam, <span class="hljs-number">4</span>, GLES20.GL_FLOAT, <span class="hljs-keyword">false</span>, <span class="hljs-number">0</span>, floorColors);GLES20.glEnableVertexAttribArray(floorPositionParam);GLES20.glEnableVertexAttribArray(floorNormalParam);GLES20.glEnableVertexAttribArray(floorColorParam);GLES20.glDrawArrays(GLES20.GL_TRIANGLES, <span class="hljs-number">0</span>, <span class="hljs-number">24</span>);checkGLError(<span class="hljs-string">"drawing floor"</span>);}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul>

监测是否眼睛查看到视野中的物体代码(为了可以点击消除掉cube)

<code class="hljs java has-numbering"> <span class="hljs-javadoc">/*** Check if user is looking at object by calculating where the object is in eye-space.**<span class="hljs-javadoctag"> @return</span> true if the user is looking at the object.*/</span><span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isLookingAtObject</span>() {<span class="hljs-comment">// Convert object space to camera space. Use the headView from onNewFrame.</span>Matrix.multiplyMM(modelView, <span class="hljs-number">0</span>, headView, <span class="hljs-number">0</span>, modelCube, <span class="hljs-number">0</span>);Matrix.multiplyMV(tempPosition, <span class="hljs-number">0</span>, modelView, <span class="hljs-number">0</span>, POS_MATRIX_MULTIPLY_VEC, <span class="hljs-number">0</span>);<span class="hljs-keyword">float</span> pitch = (<span class="hljs-keyword">float</span>) Math.atan2(tempPosition[<span class="hljs-number">1</span>], -tempPosition[<span class="hljs-number">2</span>]);<span class="hljs-keyword">float</span> yaw = (<span class="hljs-keyword">float</span>) Math.atan2(tempPosition[<span class="hljs-number">0</span>], -tempPosition[<span class="hljs-number">2</span>]);<span class="hljs-keyword">return</span> Math.abs(pitch) < PITCH_LIMIT && Math.abs(yaw) < YAW_LIMIT;}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul><div class="save_code tracking-ad" style="display: block;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul>

Google最新VR(sdk的诞生)相关推荐

  1. GOOGLE VR SDK开发VR游戏,VR播放器之一

    最近一年来,VR虚拟现实和AR增强现实技术的宣传甚嚣尘上.其实VR,AR技术很早就有了,一直没有流行开来,不可否认价格是影响技术推广的最大壁垒.谷歌对VR最大的贡献是提供了廉价的谷歌眼镜,按照GOOG ...

  2. GOOGLE VR SDK开发VR游戏,VR播放器之中的一个

    近期一年来,VR虚拟现实和AR增强现实技术的宣传甚嚣尘上.事实上VR,AR技术非常早就有了,一直没有流行开来.不可否认价格是影响技术推广的最大壁垒. 谷歌对VR最大的贡献是提供了便宜的谷歌眼镜,依照G ...

  3. GOOGLE VR SDK开发VR游戏,VR播放器之二

    之前简单说了CardBoardView的使用,这里写CardboardView.StereoRenderer的,使用上十分简单,和编写glsurface的Renderer一样导出有关的接口,使用OPG ...

  4. Google DayDream VR开发

    安装好开发工具Android Studio, 现在最新版本是2.3 准备一部android 4.4或以上版本 的手机. 准备一部头带式VR眼镜. 下载Google VR SDK for Android ...

  5. 适用于 Flutter 的 Google 移动广告 SDK 正式版现已发布

    作者 / Zoey Fan,Flutter 产品经理 应用变现有多种方法: 通过实体企业的店面接受付款.提供订阅或应用内购买,或者直接在应用中投放广告.经过六个月的 beta 测试期,我们很高兴能够推 ...

  6. Google针对非 SDK 接口的限制

    Google针对非 SDK 接口的限制 前言 最近在项目中遇到一个问题,非系统签名应用预装到android sdk为28的系统vender或者system分区下,调用隐藏api时,程序崩溃. 报错信息 ...

  7. 最新DirectX SDK及Runtime官方下载地址

    最新DirectX SDK及Runtime官方下载地址 http://www.microsoft.com/en-us/download/search.aspx?q=directx Editor's c ...

  8. 最新7z,sdk下载地址

    最新7z,sdk下载地址: 官网都不好找 https://jaist.dl.sourceforge.net/project/sevenzip/LZMA SDK/lzma1900.7z

  9. Google VR开发-Cardboard VR SDK头部追踪实现(罗德里格旋转公式)

    一.罗德里格旋转公式 可以参考百度百科和维基百科进行了解. 概括来说就是罗德里格旋转公式就是用来求旋转后新向量的公式: 而这个公式可以转换成矩阵形式: 公式各部分的几何意义和推导原理参考下图 这个图证 ...

最新文章

  1. PC行业为何需要华为们被搅局?
  2. Eclipse新建web项目和“javax.servlet.http.HttpServlet“ was not found on the Java Build Path错误
  3. 使用原生JavaScript
  4. phoengap–node+websocket在线聊天室
  5. Linux之shell脚本(2)
  6. CVPR2020 | 当目标跟踪遇上对抗攻击
  7. controller,sevices层,java初步了解
  8. 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
  9. rhel7 ifconfig command not found
  10. adb工具包的安装和使用方法
  11. windows下CCS安装教程
  12. java控制台进度_java进度条:控制台输出百分比示例代码
  13. Protobuf使用手册--中文版
  14. 万能设配器代码 带加载更多
  15. 点微同城小程序配置教程及提交审核包过审经验分享
  16. 程序员,停止你的焦虑
  17. LibreCAD v2.2.0源码编译,使用VS2019+Qt5.12.9+Boost1.71.0环境
  18. [10] JMeter-察看结果树,你知道都有哪些功能吗?
  19. Zhong__Centos配置NTP时间同步
  20. java解析html之HTMLparser初次尝试

热门文章

  1. 定义一个数组并输出-Java
  2. pycharm批量注释
  3. 使用python抓取App数据
  4. 【Redis】回顾Redis知识点之事务机制
  5. 操作系统存储管理实验课程设计报告
  6. 时间、日期的一些用法
  7. [操作系统]关于平均周转时间的一些题目
  8. 集成WEB服务器的蓝牙路由器及低功耗BLE WIFI 网络规划和实施
  9. sqar+matlab,基于MATLAB的数字图像预测压缩编码
  10. Python绘图一条龙--大小/坐标/标签/多图布局/配色方案等