VR應用開發需要什麼知識?

第一次提問

目前是某大學商科學生 從去年9月份開始關注VR了 之前也買了國內某某影音的眼鏡研究了一下 很看好VR的前景 也很想在這個行業創業 這段時間做硬體的公司實在太多 也感覺我一個學生做硬體很難做起來 所以現在很想知道做應用開發需要些什麼樣的技術??(對於Computer Science 知道的不多 正準備自學一點) 現在想找人一起創業 技術人才這方面 該找學過什麼的 會什麼技能的人?? 大家對這方面有什麼建議嗎??


操起U3D就開搞

樓下保持隊形

哎瑪.....感覺要玩壞的節奏,題主確定不是把沒有幫助點成感謝了么,外出回老家,爪機不方便,先佔坑過幾天再答。

-------------------------分-----------------------------------割-----------------------------------線--------------------------------

首先來貼張圖,我自己歸納的AR/VR相關領域的東西。

AR/VR相關領域

這裡我要說的一點就是硬體。誠然,硬體的確很難搞,國內在這方面就是荒漠,所以,如果你有信心,完全可以開拓一片藍海。注意我是說真正的硬體,那些把Google的紙盒子拿來改改就能融資千萬的我就不說了,呵呵二字而已。

軟體相比硬體就簡單了,一如當年個人站長,是個人就能搞。參見上圖軟體部分,軟體基礎如編程語言之類的就不多說了,主要說下場景搭建,現在似乎好像大多數的相關應用都是基於3D場景的,牛逼的人直接寫代碼生成場景,我等渣渣只能仰望此類大神,而一般人的做法都是利用各種成熟的解決方案-遊戲引擎來構建場景,簡單的如中視典,操作簡單,是我大學時期VR入門的好榜樣。複雜的如如ue4,unity3d等遊戲引擎,專業程度較高,實現效果也比較豐富多樣。而U3D豐富多樣的在線商店也提供了眾多模型腳本,號稱策劃都能用的引擎。

總之,技術選型這方面,以目前國內VR的尿性來說...沒多大區別,客戶關心的只是結果,誰管你用的什麼技術不是么。

然後你提到了創業。創業不是那麼簡單的,建議買本知乎的《創業時我們在知乎聊什麼》看看。因為我以前也瞎搞過幾次,類似工作室的性質,創業,真的不是那麼簡單。

然後說創業的內容,在鎮樓圖的左邊,是這個行業的主要幾個創業途徑,你看你覺得哪個部分能有搞頭就認準目標一頭扎進去吧,熬個幾年說不定就成業界大神了,這方面國內的積累也真是....

最後是好久才來填坑,還填的這麼劣質不好意思啊,收假回來新項目上馬,第一次帶隊鴨梨山大,就沒時間刷知乎了,答題質量這麼次我也看不下去,實在不行,你來咬我啊。


操起 UE4 就開搞


參考文章:Oculus + Node.js + Three.js 打造VR世界 |VR第一資訊 VR013

周五Hackday Showcase的時候,突然有了點小靈感,便將閑置在公司的Oculus DK2借回家了——已經都是灰塵了~~。

在嘗試一個晚上的開發環境搭建後,我放棄了開發原生應用的想法。一是沒有屬於自己的電腦(如果Raspberry Pi II不算的話)——沒有Windows、沒有GNU/Linux,二是公司配的電腦是Mac OS。對於嵌入式開發和遊戲開發來說,Mac OS簡直是手機中的Windows Phone——坑爹的LLVM、GCC(Mac OS )、OpenGL、OGLPlus、C++11。並且官方對Mac OS和Linux的SDK的支持已經落後了好幾個世紀。

說到底,還是Web的開發環境到底還是比較容易搭建的。這個repo的最後效果圖如下所示:

效果:

  1. WASD控制前進、後退等等。
  2. 旋轉頭部 = 真實的世界。
  3. 附加效果: 看久了頭暈。

現在,讓我們開始構建吧。

Node Oculus Services

這裡,我們所要做的事情便是將感測器返回來的四元數(Quaternions)與歐拉角(Euler angles)以API的形式返回到前端。

安裝Node NMD

Node.js上有一個Oculus的插件名為node-hmd,hmd即面向頭戴式顯示器。它就是Oculus SDK的Node介面,雖說年代已經有些久遠了,但是似乎是可以用的——官方針對 Mac OS和Linux的SDK也已經很久沒有更新了。

在GNU/Linux系統下,你需要安裝下面的這些東西的

freeglut3-dev
mesa-common-dev
libudev-dev
libxext-dev
libxinerama-dev
libxrandr-dev
libxxf86vm-dev

Mac OS如果安裝失敗,請使用Clang來,以及GCC的C標準庫(PS: 就是 Clang + GCC的混合體,它們之間就是各種複雜的關係。。):

export CXXFLAGS=-stdlib=libstdc++

export CC=/usr/bin/clang
export CXX=/usr/bin/clang++

(PS: 我使用的是Mac OS El Captian + Xcode 7.0. 2)clang版本如下:

Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

反正都是會報錯的:

ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Service/Service_NetClient.o) was built for newer OSX version (10.7) than being linked (10.5)
ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Tracking/Tracking_SensorStateReader.o) was built for newer OSX version (10.7) than being linked (10.5)
ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Util/Util_ImageWindow.o) was built for newer OSX version (10.7) than being linked (10.5)
ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Util/Util_Interface.o) was built for newer OSX version (10.7) than being linked (10.5)
ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Util/Util_LatencyTest2Reader.o) was built for newer OSX version (10.7) than being linked (10.5)
ld: warning: object file (Release/obj.target/hmd/src/platform/mac/LibOVR/Src/Util/Util_Render_Stereo.o) was built for newer OSX version (10.7) than being linked (10.5)
node-hmd@0.2.1 node_modules/node-hmd

不過,有最後一行就夠了。

Node.js Oculus Hello,World

現在,我們就可以寫一個Hello,World了,直接來官方的示例~~。

var hmd = require("node-hmd");

var manager = hmd.createManager("oculusrift");

manager.getDeviceInfo(function(err, deviceInfo) {
if(!err) {
console.log(deviceInfo);
}
else {
console.error("Unable to retrieve device information.");
}
});

manager.getDeviceOrientation(function(err, deviceOrientation) {
if(!err) {
console.log(deviceOrientation);
}
else {
console.error("Unable to retrieve device orientation.");
}
});

運行之前,記得先連上你的Oculus。會有類似於下面的結果:

{ CameraFrustumFarZInMeters: 2.5,
CameraFrustumHFovInRadians: 1.29154372215271,
CameraFrustumNearZInMeters: 0.4000000059604645,
CameraFrustumVFovInRadians: 0.942477822303772,
DefaultEyeFov:
[ { RightTan: 1.0923680067062378,
LeftTan: 1.0586576461791992,
DownTan: 1.3292863368988037,
UpTan: 1.3292863368988037 },
{ RightTan: 1.0586576461791992,
LeftTan: 1.0923680067062378,
DownTan: 1.3292863368988037,
UpTan: 1.3292863368988037 } ],
DisplayDeviceName: "",
DisplayId: 880804035,
DistortionCaps: 66027,
EyeRenderOrder: [ 1, 0 ],
...

接著,我們就可以實時返回這些數據了。

Node Oculus WebSocket

在網上看到three.js - Oculus Rift這個虛擬現實的電影,並且發現了它有一個WebSocket,然而是Java寫的,只能拿來當參考代碼。

現在我們就可以寫一個這樣的Web Services,用的仍然是Express + Node.js + WS。

var hmd = require("node-hmd"),
express = require("express"),
http = require("http").createServer(),
WebSocketServer = require("ws").Server,
path = require("path");

// Create HMD manager object
console.info("Attempting to load node-hmd driver: oculusrift");
var manager = hmd.createManager("oculusrift");
if (typeof(manager) === "undefined") {
console.error("Unable to load driver: oculusrift");
process.exit(1);
}
// Instantiate express server
var app = express();
app.set("port", process.env.PORT || 3000);

app.use(express.static(path.join(__dirname + "/", "public")));
app.set("views", path.join(__dirname + "/public/", "views"));
app.set("view engine", "jade");

app.get("/demo", function (req, res) {
"use strict";
res.render("demo", {
title: "Home"
});
});

// Attach socket.io listener to the server
var wss = new WebSocketServer({server: http});
var id = 1;

wss.on("open", function open() {
console.log("connected");
});

// On socket connection set up event emitters to automatically push the HMD orientation data
wss.on("connection", function (ws) {
function emitOrientation() {
id = id + 1;
var deviceQuat = manager.getDeviceQuatSync();
var devicePosition = manager.getDevicePositionSync();

var data = JSON.stringify({
id: id,
quat: deviceQuat,
position: devicePosition
});

ws.send(data, function (error) {
//it"s a bug of websocket, see in https://github.com/websockets/ws/issues/337
});
}

var orientation = setInterval(emitOrientation, 1000);

ws.on("message", function (data) {
clearInterval(orientation);
orientation = setInterval(emitOrientation, data);
});

ws.on("close", function () {
setTimeout(null, 500);
clearInterval(orientation);
console.log("disconnect");
});
});

// Launch express server
http.on("request", app);
http.listen(3000, function () {
console.log("Express server listening on port 3000");
});

總之,就是連上的時候不斷地發現設備的數據:

var data = JSON.stringify({
id: id,
quat: deviceQuat,
position: devicePosition
});

ws.send(data, function (error) {
//it"s a bug of websocket, see in https://github.com/websockets/ws/issues/337
});

上面有一行注釋是我之前一直遇到的一個坑,總之需要callback就是了。

Three.js + Oculus Effect + DK2 Control

在最後我們需要如下的畫面:

當然,如果你已經安裝了Web VR這一類的東西,你就不需要這樣的效果了。如標題所說,你已經知道要用Oculus Effect,它是一個Three.js的插件。

在之前的版本中,Three.js都提供了Oculus的Demo,當然只能用來看。並且交互的介面是HTTP,感覺很難玩~~。

Three.js DK2Controls

這時,我們就需要根據上面傳過來的四元數(Quaternions)與歐拉角(Euler angles)來作相應的處理。

{
"position": {
"x": 0.020077044144272804,
"y": -0.0040545957162976265,
"z": 0.16216422617435455
},
"quat": {
"w": 0.10187230259180069,
"x": -0.02359195239841938,
"y": -0.99427556991577148,
"z": -0.021934293210506439
}
}

歐拉角與四元數

(ps: 如果沒copy好,麻煩提出正確的說法,原諒我這個掛過高數的人。我只在高中的時候,看到這些資料。)

歐拉角是一組用於描述剛體姿態的角度,歐拉提出,剛體在三維歐氏空間中的任意朝向可以由繞三個軸的轉動複合生成。通常情況下,三個軸是相互正交的。

對應的三個角度又分別成為roll(橫滾角),pitch(俯仰角)和yaw(偏航角),就是上面的postion裡面的三個值。。

roll = (rotation about Z);

pitch = (rotation about (Roll ? Y));

yaw = (rotation about (Pitch ? Raw ? Z));」

— 引自《Oculus Rift In Action》

轉換成代碼。。

this.headPos.set(sensorData.position.x * 10 - 0.4, sensorData.position.y * 10 + 1.75, sensorData.position.z * 10 +10);

四元數是由愛爾蘭數學家威廉·盧雲·哈密頓在1843年發現的數學概念。

從明確地角度而言,四元數是複數的不可交換延伸。如把四元數的集合考慮成多維實數空間的話,四元數就代表著一個四維空間,相對於複數為二維空間。

反正就是用於描述三維空間的旋轉變換。

結合下代碼:

this.headPos.set(sensorData.position.x * 10 - 0.4, sensorData.position.y * 10 + 1.75, sensorData.position.z * 10 + 10);
this.headQuat.set(sensorData.quat.x, sensorData.quat.y, sensorData.quat.z, sensorData.quat.w);

this.camera.setRotationFromQuaternion(this.headQuat);
this.controller.setRotationFromMatrix(this.camera.matrix);

就是,我們需要設置camera和controller的旋轉。

這使我有足夠的理由相信Oculus就是一個手機 + 一個6軸運動處理組件的升級板——因為,我玩過MPU6050這樣的感測器,如圖。。。

Three.js DK2Controls

雖然下面的代碼不是我寫的,但是還是簡單地說一下。

/*
Copyright 2014 Lars Ivar Hatledal
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

THREE.DK2Controls = function (camera) {

this.camera = camera;
this.ws;
this.sensorData;
this.lastId = -1;

this.controller = new THREE.Object3D();

this.headPos = new THREE.Vector3();
this.headQuat = new THREE.Quaternion();

var that = this;
var ws = new WebSocket("ws://localhost:3000/");
ws.onopen = function () {
console.log("### Connected ####");
};

ws.onmessage = function (evt) {
var message = evt.data;
try {
that.sensorData = JSON.parse(message);
} catch (err) {
console.log(message);
}
};

ws.onclose = function () {
console.log("### Closed ####");
};

this.update = function () {

var sensorData = this.sensorData;
if (sensorData) {
var id = sensorData.id;
if (id &> this.lastId) {
this.headPos.set(sensorData.position.x * 10 - 0.4, sensorData.position.y * 10 + 1.75, sensorData.position.z * 10 + 10);
this.headQuat.set(sensorData.quat.x, sensorData.quat.y, sensorData.quat.z, sensorData.quat.w);

this.camera.setRotationFromQuaternion(this.headQuat);
this.controller.setRotationFromMatrix(this.camera.matrix);
}
this.lastId = id;
}

this.camera.position.addVectors(this.controller.position, this.headPos);
if (this.camera.position.y &< -10) { this.camera.position.y = -10; } if (ws) { if (ws.readyState === 1) { ws.send("get "); } } }; };

打開WebSocket的時候,不斷地獲取最新的感測器狀態,然後update。誰在調用update方法?Three.js

我們需要在我們的初始化代碼里初始化我們的control:

var oculusControl;

function init() {
...
oculusControl = new THREE.DK2Controls( camera );
...
}

並且不斷地調用update方法。

function animate() {
requestAnimationFrame( animate );
render();
stats.update();
}
function render() {
oculusControl.update( clock.getDelta() );
THREE.AnimationHandler.update( clock.getDelta() * 100 );

camera.useQuaternion = true;
camera.matrixWorldNeedsUpdate = true;

effect.render(scene, camera);
}

最後,添加相應的KeyHandler就好了~~。

Three.js KeyHandler

KeyHandler對於習慣了Web開發的人來說就比較簡單了:

this.onKeyDown = function (event) {
switch (event.keyCode) {
case 87: //W
this.wasd.up = true;
break;
case 83: //S
this.wasd.down = true;
break;
case 68: //D
this.wasd.right = true;
break;
case 65: //A
this.wasd.left = true;
break;
}
};

this.onKeyUp = function (event) {
switch (event.keyCode) {
case 87: //W
this.wasd.up = false;
break;
case 83: //S
this.wasd.down = false;
break;
case 68: //D
this.wasd.right = false;
break;
case 65: //A
this.wasd.left = false;
break;
}
};

然後就是萬惡的if語句了:

if (this.wasd.up) {
this.controller.translateZ(-this.translationSpeed * delta);
}

if (this.wasd.down) {
this.controller.translateZ(this.translationSpeed * delta);
}

if (this.wasd.right) {
this.controller.translateX(this.translationSpeed * delta);
}

if (this.wasd.left) {
this.controller.translateX(-this.translationSpeed * delta);
}

this.camera.position.addVectors(this.controller.position, this.headPos);

if (this.camera.position.y &< -10) { this.camera.position.y = -10; }

快接上你的HMD試試吧~~

-----------------------分割符-----------------------

qq群號:544405366


誤入歧途。

畢業後,搞了五年運營商務,沒碰過一行代碼,突然開始自己抓一下引擎,看遍UE Tutorial之後,覺得UE很合適呀。

----8.16-----

關於VR有多少可以做的方向,請參見我之前回答的一個帖子

VR 從業者最基本的條件? - Lemony 的回答

比較全面的概括了一下目前VR行業的全部情況,你要想創業就找到適合自己的坑,去跳就好。

今天多說說關於VR裡面一個蠻關鍵的點,就是圖形圖像方面的。

目前技術解決完全就緒的VR方案,我看來看去也真的只有通過遊戲引擎實時渲染的才算是。

補充了宏觀背景知識,生成視頻的方式有:

1. 實拍視頻縫合;

2. CG合成;

3. 遊戲引擎實時渲染;

而VR這種需要有強沉浸感的東西,一定需要所見即所得,與內部的物體產生交互,頭和手部的移動可以完全的提現在虛擬空間中。

所以,在我內心中,能滿足VR Content標準的,就僅僅只有遊戲引擎;

選擇遊戲引擎就是難點了,糾結在UE和Unity上面巨長時間,知乎er們也一直在爭論,最終暫定了第一個項目選擇UE。

理由:

1. 軟體整合程度高,所有工具都集成了,和Unity比起來初級進階要快一些;

2. Blueprint, 吐槽BP的人多的去了,但是真的自己用了用,發現基本和UML語言一樣,private/Public屬性要定義,Interface要自己定義,要各種cast,基本和普通高級語言區別不大,有一點特別搓,就是稍微一點點邏輯就好大的篇幅,對於潔癖的程序員們,估計肯定看不下去;

3. 材質工具簡單便捷,沒用過Unity的牛的材質插件,但是UE的材質工具讓工作室以前做CG的小夥伴很快上手;

4. 燈光、渲染(Shader),我沒用過高級功能,但是基本自帶的渲染/Post Process已經完全能夠滿足我們的對視覺的上的訴求。

其他,好像國外頂尖團隊都在用,有一種跟風的心理。

針對引擎的部分,知乎大牛太多,不班門弄斧了。想到再補充吧。


學VR開發,少不了的就是階段性學習,完整的階段包括C#基礎、Unity基礎、Unity項目實戰、VR常用設計模式、數據結構、3D數據數學、圖形學、文件存儲、多線程、SVN使用、socket、AssetBundle、遊戲框架、Lua、Python。

學習過程中,你還需要了解一些有用的東西,比如入門資源:

1、FusedVR的教程和現場直播:包括從建模到遊戲引擎所能實現的內容創作的的演練,很不錯。

2、Udacity的VR開發者Nanodegree:涵蓋VR的應用程序開發、設計和優化的完整程序。

3、Unity和Unreal的教程。

想了解更多知識?關注我後續的回答啊。


ps:該VR公司做的產品以手勢識別為主,並不是搞個眼鏡配點3D ui就算了,是要識別人的動作的。

今天跟一個做VR公司的CEO交流了下,需要的技術很多,門檻也不低。

現在做VR跟做手機差不多,但更關注演算法,據他說,就演算法有下面這些:模型匹配,機器學習,深度學習,人體反向動力學,計算機視覺,物理加速,樣本訓練,骨架資料庫,動態跟蹤及矯正,物體識別庫,骨架識別和提取,動態實時3D建模,實時3D摳圖。

當然做應用的,只要等廠商出sdk,然後就著sdk開發就行,不做遊戲的話,去學android吧。


如果你是一名網頁開發人:

UnityScript是由JavaScript衍生的工具,能夠用於Unity遊戲和應用腳本。

WebVR 是一款實驗性的API,他使用Three.JS或WebGL在Firefox或Chromium瀏覽器中能看到VR網站。

A-Frame是一款MozVR中心的標記語言,能用HTML格式的語言為基於瀏覽器的VR設備做出VR內容來。

如果你是Objective-C或是Java的開發者:

用C#、UnityScript或Boo作腳本,Unity支持兩種語言的移動平台應用開發。

Cardboard和GearVR都自帶軟體開發工具包,能使用Java在選擇的移動IDE或Xcode的Objective-C上開發自帶安卓應用。

如果你是C#開發者:

Unity支持C#腳本,而且編輯器帶有豐富的3D建設工具

Unity的跨平台功能能應用在不同平台上,包括安卓、iOS和Windows

如果你是C/C++開發者:

虛幻引擎的編輯器使用C++作為腳本語言

使用Oculus 軟體開發工具包直接寫入OpenGL(點擊下載Oculus文件)

OSVR提供酷睿資料庫和虛擬引擎插件

OpenVR的API能對接C++

歡迎關註:Blog Archive


VR行業還在高速發展,新的市場和領域未來也會不斷出現。就目前來分可以粗略地分為:硬體、內容生產工具、內容、內容發布平台(渠道)幾個方向。

  1. 硬體包括視覺模擬(HTCVIVE、Oculus、google Daydream等)、觸覺模擬(Manus力反饋手套、Dexmo外骨骼、Skinterface觸覺緊身衣)、行進模擬(Omni、Kat跑步機、多軸駕駛艙)、味覺嗅覺模擬(KokiriLab等氣味定向擴散系統)、聽覺模擬(時代拓靈等全景音)、性用品模擬(不可描述)。不同的硬體開發需要的知識體系是不同的,選擇感興趣並適合自己的方向去學習就好。
  2. 內容生產工具目前做的最好的是UnrealEngine4和Unity3D。UnrealEngine4是開源的,你可以學習他的源代碼。目前已經有團隊在針對不同領域開發垂直細分的生產工具了,比如我們。形象地比喻,PS功能再強大,美圖秀秀也是有它的市場的。我們就是希望未來VR內容不再是專業和高深莫測的東西,所有人都可以成為VR自媒體。做生產工具需要軟體基礎,主要是C++、資料庫、OpenGl、DirectX等知識。
  3. 內容生產是未來最大也最有潛力的一個市場。因為它的涵蓋範圍實在是太廣了:地產、旅遊、教育、醫療、汽車、遊戲、社交、媒體等等所有隻要是需要用眼鏡去看的行業都會有VR的用武之地。我們目前也是靠這個生存的。它需要的知識包括建模、材質、動畫、場景設計、行為腳本編寫、用戶界面設計和工程優化。其中工程優化需要貫穿在前幾個工作中。VR因為雙眼加高幀數,類似場景的渲染開銷至少是平面內容的4倍以上。這就要求在工作中嚴格按照所有能夠降低渲染開銷的方法來處理內容,工作量比平面內容要更大。其中行為腳本和用戶界面即需要從人體工程學出發,拋棄過去的一切開發經驗,重新開發一套基於真實行為和人眼觀察方法的體系,又要兼顧渲染線程的性能開銷,做到高質低耗。因此這行入門不難,做精不易,遊戲公司、模型效果圖公司、影視動畫公司等都在準備或已經入場,未來必然是一個魚龍混雜的行業,拼殺也會很激烈。找一個垂直細分的小領域或許是一個捷徑。
  4. 渠道也是一個很大的板塊,它分為兩個方向,一個是線下一個是線上。
  • 個人猜想線下之前的蛋椅和體驗店將會被洗牌,以後會出現更大型的VR娛樂城,他們設備更多更好更貴,視覺聽覺觸覺味覺成人用品能上的都給你上,一套設備沒幾百萬下不來,普通人肯定買不起,買得起家裡也放不下。分超大、大、中包房,超大包里最多可以20人同時上線,彼此能看到對方,10對10槍戰空戰機甲戰、推塔斗鬼狼人殺愛幹嘛幹嘛。就我了解目前也確實有老闆在做這方面的嘗試。對這方面有興趣的或許可以先從富二代干起?(誤)
  • 線上的渠道目前是HTC、Oculus、Steam三家為主。兩家靠硬體、一家靠遊戲。國內還有一些做VR資訊的,87870之類。個人猜想未來國內市場有可能還是幾個大佬把持。支付寶綁定VR購物,微信穩守VR社交,百度做做內容榜單,年度第一「VR無痛人流」(誤)。VR的互聯網數據傳輸量大了很多,華為的5G有地方用了。VR旅遊、VR影視、VR自媒體都會出幾個大佬。對這方面有興趣的趕緊去抱大腿。不過風險也是有的,畢竟當年誰能想到諾基亞手機會做不下去呢。

以上


前不久,我負責了公司了「虛擬現實在教育領域應用」的課題研究。最後,我們小組做了個產品原型和教程,一方面是為了探索VR技術與校園場景的結合更多可能,另外一方面希望也是通過本項目幫助大家快速的了解目前的VR產品是如何製作的。可以查看我的專欄文章:知乎專欄


感覺也沒有錢是打算忽悠程序員白乾么?

VR這麼虛的東西,不燒個好幾年能出成果么


題主,你好。VR技術已經逐漸滲透進各個行業中,並且在未來的發展趨勢可被預見,因此,很多人也和題主一樣,想要對VR行業的開發及研究上進行深入探索。想在VR行業創業、完成應用開發,題主首先需要知道VR實現過程中的四個方向:

  • 相同VR設備相同的運行平台
  • 相同VR設備不同的運行平台
  • 不同VR設備不同的運行平台
  • 不同VR設備相同的運行平台

有些人可能難以理解這四點的含義,其實,VR開發的東西通常比較繁複,即便是不開發,題主玩遊戲的時候也需要知道在哪個平台啟動遊戲。康石石簡要列舉幾個不同的VR設備及其運行平台,以便題主在VR的應用開發中,對VR的設備、SDK、趨勢等方面有一個較為宏觀的認識:

1. Cardboard:便捷的低端頭顯

運行端:蘋果手機、安卓手機

控制器:頭控+藍牙手柄、體感控制器

軟體平台:IOS App、Android App

開發SDK:Google VR SDK for Unity/Unreal + Xcode IDK、Google VR SDK for Unity/Unreal+ Android Studio、 Google VR SDK for IOS、Google VR SDK/NDK for Android

2. Daydream進階Cardboard

運行端:Daydream手機+Android App

控制器:Daydream手柄

開發SDK:Google VR SDK for Android、Google VR SDK for Unity/Unreal

另外,今年Google I/O大會提出的 Daydream VR一體機概念,將移動式VR提上日程。

3. Gear VR:中端頭顯

軟體平台:三星手機Android App

開發SDK:Google VR SDK/NDK for Android、

控制器:自帶控制器、體感控制器

4. HTC Vive 最自由的VR頭顯

運行端:PC

軟體平台:Steam、SteamVR

開發SDK:遊戲引擎+SteamVR Plugin

控制器:Vive雙手柄、體感控制器

5. Oculus Rift:輕便的高級頭顯

運行端:PC

軟體平台:Oculus Home、Steam、SteamVR

開發SDK:遊戲引擎+Oculus rift DK2、SteamVR plugin

控制器:Xbox單手柄、Oculus Touch、體感控制器、(未來無線手柄)

6. Holonens:全息MR頭顯

運行端:自帶GPU+CPU+HPU+深度攝像頭

控制器:自帶手勢

題主了解VR的應用開發時,也要考慮到自己的預算,然後進行開發。為了方便題主能夠更加了解VR的應用開發,康石石以Cardboard+Unity+IOS的開發為例作一下簡要講解:

1. 在Unity官網下載Unity 5.6以上版本,安裝時需選擇IOS和安卓Support。

2. 在Google VR官網上下載SDK。

注意的是SDK版本更新換代很快,看清楚官網的更新資料。

在unity中導入最新SDK assets、import package、customer package、Google VR SDK。

3. 打開Demo文件夾中的Scenes,體驗demo場景。

4. play模式播放後,按Alt和Ctrl模擬頭控動作。

5. 如果想把demo導入蘋果手機通過Cardboard顯示,需要對Files下的Build Setting進行修改,選擇IOS模式。

6. 在player setting進行對應設置,支持VR模式/Identification設置。

7. Build文件,Build Successful之後找到創建好的Xcode文件,打開其中.xcodeproject文件。

8. 用USB連接蘋果手機,在Xcode中運行文件,手機上會出現相應APP,運行使用。

另外,過程中會出現調試錯誤,根據對應參數修改即可。

9. 蘋果手機上運行App,準星使方塊變色。

題主如果想學習不經過Unity而直接通過IOS的Xcode IDE開發,可以參考下面這個鏈接中的案例:

網站鏈接:一天時間搞定iOS遊戲開發經驗分享 - CocoaChina_讓移動開發更簡單

以上望有幫助,歡迎交流

———————————————————

歡迎關注我的個人官方微信(kang-shishi)

如有藝術留學、院校、專業、作品集方面的問題,可私信康石石諮詢


來點乾貨吧,推薦一本書《The VR Book》,網上有英文原版的所有內容。有了這本書,你就有了所有VR相關的知識。這本書可以算是VR開發的聖經了。

Virtual Reality - LaValle

作者是伊利諾伊大學的教授,一直從事VR方面的研究,從學校出來在早期加入Oculus,成為Oculus早期的科學家,後來從Oculus出來又回到大學從事VR方面的教學,去年加入華為,成為華為在VR/AR方面的首席科學家。

他的這本書把VR的設計過程介紹的很詳細,從生物學(人的眼睛成像原理,人為什麼會眩暈),物理光學(透鏡的物理學原理,畸變的原理等),到計算機圖形學(MVP矩陣,引擎,相機等),計算機硬體的需求(PPI,FPS)都有詳細介紹,有些部分介紹的即使不是非常深入,但是你了解後,也可以知道沿著哪條路去繼續了解。

這本書里的知識如果都掌握了才能說是真正對VR的開發,設計入門了。只是使用Unity或者Unreal開發個遊戲在VR里跑起來實際上對VR系統的理解不夠深刻。只是可以做一些開發。對系統的深入了解才能開發的更好對不對。


操起PHP就開搞,瑪德,咋搞?


操起彙編就開搞


感覺很不錯的,vr好賣嗎?我這邊有生產的!好賣的話我賣賣


VR將改變這個世界! 我們真的是在現實世界嗎?


樓上一堆亂搞容易搞死機嘍


操起Cocos2dx就開搞(好吧其實搞不了) 樓下隊形


C#語言編程基礎+熟練掌握Unity3D軟體就可以開發VR應用遊戲了。


操起sublime就開搞


推薦閱讀:

2016 年 10 月的 Steam Dev Days 上有哪些亮點?
「虛擬現實」是否會成為未來遊戲業界發展的主流趨勢?
開一間Vr體驗館前景如何?
北上廣深有哪些VR體驗店?
為什麼在虛擬現實技術等用物理和數學規律模擬世界需要耗費大量的計算?

TAG:虛擬現實VR | OculusRift | HTCVive |