51. 顔描画のための3Dデータ作成
var video;
var model; //顔認識のための学習モデル
var faceMesh; //顔の3Dデータ
window.onload = function() {
let constraints = { video: { width: 640, height: 480 } };
navigator.mediaDevices.getUserMedia(constraints).then(
function(mediaStream) {
video = document.getElementById("video");
video.srcObject = mediaStream;
video.onloadedmetadata = function(e) {
video.play();
InitRendering();
//顔の3Dモデルを作成 (このあと記述)
CreateFaceObject();
StartTracking();
};
}
);
}
Lesson12
52. 顔描画のための3Dデータ作成
var video;
var model;
var faceMesh;
window.onload = function() {
/*諸々の初期化。スペースの都合上、省略*/
}
このあと、この辺りにCreateFaceObject関数を記述
function InitRendering(){
/*three.jsの初期化。さっきまで解説していたところ*/
}
async function StartTracking(){
/*学習モデルの読み込みと顔認識スタート*/
}
async function FaceTrackingLoop() {
/*顔を検出するループ*/
}
53. 顔描画のための3Dデータ作成
function CreateFaceObject() {
//顔の形状をgeometryで管理
let geometry = new THREE.Geometry();
//頂点を登録(座標は今のところ適当)
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//色などの見た目情報をmateriaに登録
let material= new THREE.PointsMaterial( { color: 0x0000FF, size: 3 } );
//faceMeshに形状(geometry)と見た目(material)を登録。
faceMesh= new THREE.Points( geometry, material );
//three.jsに登録(threejs-ex.js内で処理)
AddToThreejs(faceMesh);
}
Lesson13
54. 顔の特徴点をリアルタイムに描画
window.onload = function() {
/*諸々の初期化。スペースの都合上、省略*/
}
function CreateFaceObject() {
/*顔の3Dデータを作る*/
}
function InitRendering(){
/*three.jsの初期化*/
}
async function StartTracking(){
/*学習モデルの読み込みと顔認識スタート*/
}
async function FaceTrackingLoop() {
/*顔を検出するループ*/
}
顔の検出結果を3Dモデルに反映させる
55. 顔の特徴点をリアルタイムに描画
async function FaceTrackingLoop() {
let predictions = await model.estimateFaces(video);
if (predictions.length > 0) {
//検出された顔の頂点配列にアクセス
let keypoints = predictions[0].scaledMesh;
//顔の3Dモデルの頂点等の情報にアクセス
let geometry=faceMesh.geometry;
for (let i = 0; i < keypoints.length; i++) {
let x = keypoints[i][0];
let y = keypoints[i][1];
geometry.vertices[i].set(x-video.width/2, -y+video.height/2, 1);
}
//情報の更新を許可
faceMesh.geometry.verticesNeedUpdate = true;
}
//上記の情報をThree.jsで描画
RenderThreejs();
requestAnimationFrame(FaceTrackingLoop);
}
Lesson14
61. ポリゴン化しよう
window.onload = function() {
/*諸々の初期化。スペースの都合上、省略*/
}
function CreateFaceObject() {
/*顔の3Dデータを作る*/
}
function InitRendering(){
/*three.jsの初期化*/
}
async function StartTracking(){
/*学習モデルの読み込みと顔認識スタート*/
}
async function FaceTrackingLoop() {
/*顔を検出するループ*/
}
顔の3Dモデルをポリゴンとして設定
62. ポリゴン化しよう
function CreateFaceObject() {
let geometry = new THREE.Geometry();
//頂点を登録
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//頂点の接続情報
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
}
//色などの見た目情報をmaterial管理
let material= new THREE.PointsMaterial( { color: 0x0000FF, size: 3 } );
//faceMeshに形状(geometry)と見た目(material)を登録。
faceMesh= new THREE.Points( geometry, material );
AddToThreejs(faceMesh);
}
Lesson16
63. ポリゴン化しよう
let geometry = new THREE.Geometry();
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//頂点の接続情報
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
}
//色などの見た目情報をmaterial管理
let material= new THREE.PointsMaterial( { color: 0x0000FF, size: 3 } );
let material = new THREE.MeshBasicMaterial( {wireframe:true} );
//faceMeshに形状(geometry)と見た目(material)を登録。
faceMesh= new THREE.Points( geometry, material );
faceMesh= new THREE.Mesh( geometry, material );
//three.jsに登録
AddToThreejs(faceMesh);
let material= new THREE.PointsMaterial( { color: 0x0000FF, size: 3 } );
faceMesh= new THREE.Points( geometry, material );
Lesson17
70. テクスチャ画像を貼り付けよう
window.onload = function() {
/*諸々の初期化。スペースの都合上、省略*/
}
function CreateFaceObject() {
/*顔の3Dデータを作る*/
}
function InitRendering(){
/*three.jsの初期化*/
}
async function StartTracking(){
/*学習モデルの読み込みと顔認識スタート*/
}
async function FaceTrackingLoop() {
/*顔を検出するループ*/
}
顔の3Dモデルに画像を貼り付ける
71. テクスチャ画像を貼り付けよう
let geometry = new THREE.Geometry();
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//頂点の接続情報とテクスチャ座標対応づけ
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
}
//色などの見た目情報をmaterial管理
let material = new THREE.MeshBasicMaterial( {wireframe:true} );
//faceMeshに形状(geometry)と見た目(material)を登録。
faceMesh= new THREE.Mesh( geometry, material );
//three.jsに登録(threejs-ex.js内で処理)
AddToThreejs(faceMesh);
72. テクスチャ画像を貼り付けよう
let geometry = new THREE.Geometry();
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//頂点の接続情報とテクスチャ座標対応づけ
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
}
//色などの見た目情報をmaterial管理
let material = new THREE.MeshBasicMaterial( {wireframe:true} );
//faceMeshに形状(geometry)と見た目(material)を登録。
faceMesh= new THREE.Mesh( geometry, material );
//three.jsに登録(threejs-ex.js内で処理)
AddToThreejs(faceMesh);
ここを編集!
73. テクスチャ画像を貼り付けよう
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
//UV座標を指定
geometry.faceVertexUvs[0].push([
new THREE.Vector2(UV_COORDS[p0][0],1-UV_COORDS[p0][1]),
new THREE.Vector2(UV_COORDS[p1][0],1-UV_COORDS[p1][1]),
new THREE.Vector2(UV_COORDS[p2][0],1-UV_COORDS[p2][1])]);
}
let texture = new THREE.TextureLoader().load("画像のURL");
//色などの見た目情報をmaterial管理
let material = new THREE.MeshBasicMaterial( {wireframe:true} );
let material = new THREE.MeshBasicMaterial( {map: texture, alphaTest:0.1} );
let material = new THREE.MeshBasicMaterial( {wireframe:true} );
Lesson19
80. テクスチャ画像を貼り付けよう
function CreateFaceObject() {
let geometry = new THREE.Geometry();
//頂点を登録
for (let i = 0; i < 468; i++) {
geometry.vertices.push(new THREE.Vector3(0, 0, 0));
}
//頂点の接続情報
let index,p0,p1,p2;
for (let i = 0; i < TRIANGULATION.length / 3; i++) {
index= i * 3;
p0 = TRIANGULATION[index];
p1 = TRIANGULATION[index+1];
p2 = TRIANGULATION[index+2];
geometry.faces.push(new THREE.Face3(p0,p1,p2));
//UV座標を指定
geometry.faceVertexUvs[0].push([
new THREE.Vector2(UV_COORDS[p0][0],1-UV_COORDS[p0][1]),
new THREE.Vector2(UV_COORDS[p1][0],1-UV_COORDS[p1][1]),
new THREE.Vector2(UV_COORDS[p2][0],1-UV_COORDS[p2][1])]);
}
let texture = new THREE.TextureLoader().load( "画像のURLをここに貼り付ける" );
//色などの見た目情報をmaterial管理
let material = new THREE.MeshBasicMaterial( {map: texture, alphaTest:0.1} );
faceMesh= new THREE.Mesh( geometry, material );
AddToThreejs(faceMesh);
}