質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

解決済

1回答

2336閲覧

【Three.js】getImageData()で取得したピクセル上にPointsMaterialを配置すると反転してしまう

machine_machine

総合スコア162

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2019/01/05 09:37

前提・実現したいこと

WebGLでなんか綺麗なキラキラなパーティクルの演出を作ってみた
http://tkengo.github.io/blog/2015/07/15/webgl-particle-effect-we-are-xseeds/

こちらを参考にしながら、 new THREE.Points を使用してドットで文字を描画しようとしています。

発生している問題・エラーメッセージ

https://jsfiddle.net/va9u6dL8/

2Dコンテクストに描画した水色の TEST のうしろのほうに小さくドットで描画されているのが Points で表示したテキストです。
なぜ反転してしまったのかの理由が見当もつきません。
また、 camera.position.z = 1000 のように大きな数字を指定しないと画面内に収まらないことも解消したいと思っています。

該当のソースコード

javascript

1// THREE 初期化など 2let windowWidth = window.innerWidth 3let windowHeight = window.innerHeight 4 5const scene = new THREE.Scene() 6const renderer = new THREE.WebGLRenderer() 7const camera = new THREE.PerspectiveCamera(45, windowWidth / windowHeight) 8 9renderer.setSize(windowWidth, windowHeight) 10renderer.setPixelRatio(window.devicePixelRatio) 11 12camera.position.z = 1000 13 14// Points生成 15const pointsGeometry = new THREE.Geometry() 16let pointsMaterial = new THREE.PointsMaterial({ 17 color: 0xffffff, 18 size: 1 19}) 20const pointsMesh = new THREE.Points(pointsGeometry, pointsMaterial) 21 22scene.add(pointsMesh) 23 24 25// テキストを描画したcanvasを走査、 26// 色がある部分に点を配置 27const text = createText('test') 28 29const imageData = text.ctx.getImageData(0, 0, windowWidth, windowHeight).data 30 31for(let x = 0; x < windowWidth; x++) { 32 for(let y = 0; y < windowHeight; y++) { 33 if (imageData[(x + y * windowWidth) * 4 + 3] === 0) { 34 continue; 35 } 36 37 pointsGeometry.vertices.push( 38 new THREE.Vector3(x, y, 1) 39 ) 40 } 41} 42 43// canvasを生成してテキストを描画する関数 44function createText(text) { 45 let o = {} 46 const canvas = document.createElement('canvas') 47 const ctx = canvas.getContext('2d') 48 49 canvas.width = windowWidth 50 canvas.height = windowHeight 51 52 ctx.font = '128px serif' 53 ctx.fillStyle = '#cff' 54 ctx.textAligh = 'center' 55 ctx.fillText(text, windowWidth / 2, windowHeight / 2) 56 57 // 表示確認のため固定配置でbodyに追加 58 canvas.classList.add('text-canvas') 59 document.body.appendChild(canvas) 60 61 o.canvas = canvas 62 o.ctx = ctx 63 64 return o 65} 66 67// domに追加 68document.querySelector('#gl').appendChild(renderer.domElement) 69 70// render 71renderer.render(scene, camera)

試したこと

camera.position の値をいろいろいじってみましたが位置が変わるのみで反転は解消できませんでした。

補足情報(FW/ツールのバージョンなど)

Three.js v100を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問いただきありがとうございます。

javascript

1 2pointsGeometry.vertices.push( 3 new THREE.Vector3(x,-y, 1) 4

このようにy座標を-1倍すれば反転は直ると思います。
メッシュの大きさの問題についてはScaleを調整するか、pointsGeometry.vertices.pushの部分で倍率を掛けるかすれば解決すると思います。

投稿2019/01/05 10:29

bochan2

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

machine_machine

2019/01/05 15:08

ありがとうございます。y座標にマイナスをかけて表示的には反転は治りました。 反転が起こってしまう理由についておわかりになることはございますでしょうか。
bochan2

2019/01/05 22:40

Three.jsの座標系の問題だと思います この右手が左手のどっちか忘れたんですがy軸の向きがcanvasと逆なのが原因です
machine_machine

2019/01/06 09:26

座標系のお話はどこかで見たことがあります。こういうときに影響してくるんですね。 いろいろとご丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問