Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

3D

three.js で表示できない

ipl を WebGL で表示できる形式に変換しても,表示できないデータができてしまった.

本当は次の様に表示されなければならない.


vt と vn がない時にうまくない.
f 1// 2// 3// の様になってしまっていて,これをうまく処理してくれない.



  にほんブログ村 IT技術ブログへ


STL(Stereolithography) 読込みで…

STL(Stereolithography,Standard Triangulated Language) バイナリ読込みで,VC 14 でビルドした exe でダウンする.
VC 6 でビルドしたものは通っているが,たまたまエラーにならなかっただけ.
コードは,

    {
        size_t  hStart = 0 ;
        v_char  head ;
        head.resize(STL_B_HEADER_SIZE+100,0x00) ;
        memmove(&head,&readBuf[hStart],sizeof(STL_B_HEADER_SIZE)) ;
        stl.SetName(::To_tstring(head).c_str()) ;
        }

::To_tstring で head を利用した時にエラーとなる.
ここをコメントにすると,ブロックを抜けた時に head の解放?でエラーになる.


memmove で &head ではなく &head[0] としなければならない.

正しくは,

    {
        size_t	hStart = 0 ;
        v_char	head ;
        head.resize(STL_B_HEADER_SIZE+100,0x00) ;
        memmove(&head[0],&readBuf[hStart],STL_B_HEADER_SIZE) ;
        stl.SetName(::To_tstring(head).c_str()) ;
        }

v_char は次の様に定義.
 typedef std::vector<char> v_char ;



  にほんブログ村 IT技術ブログへ


3D ファイルの表示で黒?

個人的な形式の ipl .直接読込んで OpenGL で表示する様にコードを修正中…
表示すると黒くなる.

STL などはそれなりの色で表示される.
ワイヤフレームなどでは,色で表示されている.
原因は,ipl では法線ベクトルを持っていないので 0,0,0 として表示されていた.



  にほんブログ村 IT技術ブログへ


#define での括弧 …

STL バイナリのサイズをチェックする所でうまく判断できず,気が付くまで少し時間がかかったのでメモ.
   u_64 dataSize = STL_B_H_COUNT_SIZE + faceCount * STL_B_FACE_1_SIZE ;
   if (dataSize == fileSize) { return true ; }
STL_B_FACE_1_SIZE が 4*3*4+2 となっていて,84 + faceCount * 48 + 2 になってしまっていた.
括弧で括って 84 + faceCount * 50 で OK .
#define     STL_B_FACE_1_SIZE       (4*3*4+2)



  にほんブログ村 IT技術ブログへ


球が作成できない

背景画像のアップロードで,球を生成してそれに貼り付ける.
コード自体はそれほど難しくないので,1 日位でできると思ってた.
Windows のコンソール AP で,次の様なコードを書いてテスト.
MakeBG.cpp


#include "MessBar.hxx"
#include "i_Trace.hxx"
#include "GonsPrm2.hxx"
#include "Htm_thrj.hxx"

//*******************************************************************************
// make bg files imo and html
// Create : 2018/04/19
//*******************************************************************************
inline bool MakeBG (c_tstring& dibPath)
{
    tstring ext = ::Path_GetExtLow(dibPath) ;
    if      (ext == _T("bmp")) { ;              }
    else if (ext == _T("jpg")) { ;              }
    else if (ext == _T("png")) { ;              }
    else                       { return false ; }
    {
        tstring imoPath = ::Path_ChangeExt(dibPath,_T(".imo")) ;
        tstring htmName = ::Path_ChangeExt(dibPath,_T(".html")) ;
        tstring dmpName = ::Path_ChangeExt(dibPath,_T(".ipl")) ;
        {
            long div = 90/5 ;
            v_Vd3A pntsAry = ::BuildSphere(div) ;
            {
                std::tout << pntsAry.size() << std::endl ;
                if (pntsAry.size() > 0) {
                    Vd3A pnts = pntsAry[0] ;
                    std::tout << pnts.size() << std::endl ;
                    }
                tstring str = ::v_V3_To_tstring(pntsAry,_T(",")) ;
                {
                    std::tout << str << std::endl ;
                    }
                ::SaveText(dmpName.c_str(),str) ;
                }
            v_Vd2A  txuvAry = ::SetTextureUV(pntsAry) ;
                    pntsAry = ::V3_Scale (pntsAry,Vd3(20.)) ;
            Gons1   gons1 = ::Gons_BuildFace(pntsAry,txuvAry,dibPath.c_str()) ;
            GonsA   ga ;
                    ga.push_back(gons1) ;
            Ed3     es = ::GonsA_GetExtent(ga) ;
            {
                std::tout << imoPath << _T("\t") ;
                std::tout << ::V3_To_tstring(es.Volume()) << std::endl ;
                }
            if (es.Volume() != Vd3(0)) {
                es = Ed3(es.L*0.01,es.G*0.01) ;
                ::GonsA_ToOBJ(ga,imoPath.c_str()) ;
                ::HT_Make_three_js_html(imoPath.c_str(),es) ;
                }
            }
        }
    return true ;
    }

//*******************************************************************************
// Make BG
// Create : 2018/04/19
//*******************************************************************************
int _tmain (int argc,TCHAR* argv[])
{
    _tsetlocale(LC_ALL,_T("")) ;
    {
        double s = sin(rad(30)) ;
        double c = cos(rad(30)) ;
        std::tout << ::To_tstring(rad(30)) << _T("\t") << ::To_tstring(s) << _T("\t") << ::To_tstring(c) << std::endl ;
        }
    if (argc > 1) {
        v_tstring argAry ;
        for (int index=1 ; index<argc ; index++) {
            tstring av = argv[index] ;
            ::MakeBG(av) ;
            }
        }
    else {
        tstring buf ;
        buf.resize(1000) ;
        {
            while (std::terr << _T("dib ? =") , std::tin.getline(&buf[0],buf.size()))
            {
                tstring str = buf.c_str() ;
                if      (str == _T("q"))   { break ; }
                else if (str == _T("Q"))   { break ; }
                str = ::QuotM_Del_All(str) ;
                if (str.empty())           { continue ; }
                if (::File_IsNothing(str)) { continue ; }
                tstring dib_file = str ;
                ::MakeBG(dib_file) ;
                }
            }
        }
    return 0 ;
    }

#include "MessBar.cxx"

今度は,DS116 でビルドして実行すると,

Iwao@DS116:/var/.../Test/up_bg/data$ ./a.out
0.523599        98314745853377985068733249901357667205561433229409406145971019710277043155206326909160297391588106447153156445277590513896008090831662627743743127151181611161993303763348552511914898438567008016612049817143085994563143448055356356529593034366351316506187159487365573007925410016860727208738652774465536.000000  98321247861193438769252981549279948821735544950351014769381393881588573259178110828643912278175146924986161470094082713103803921735703931192359519739047155548857037547932930737608178537416409042994283830606984599100883034181136178714087912736395732787698542049681305006129736011480288874859116047106048.000000
dib ? =

本当は,

C:\Users\Iwao\...\i_Tools.tmp>\\DevXP\C_Drive\Temp\DS11x\MakeBG\Release.060\MakeBG.exe
0.523599        0.500000        0.866025
dib ? =

cmath が使えない様で,検索すると「-lm でコンパイルが通る」と言うのは見つかる.
が,コンパイルの問題ではなく,実行でうまくない.


当然ではあるが,DS115j でも同様.
試しに,opkg update と opkg install gcc .
root@DS116:/var/…/Iwao# opkg update
Downloading http://pkg.entware.net/binaries/armv7/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/packages
root@DS116:/var/…/Iwao# opkg install gcc
Upgrading gcc on root from 6.3.0-1 to 6.3.0-1a…
Downloading http://pkg.entware.net/binaries/armv7/gcc_6.3.0-1a_armv7soft.ipk
Configuring gcc.
root@DS116:/var/…/Iwao#
もう一度,ビルドして実行すると,
Iwao@DS116:/var/…/Test/up_bg/data$ g++ MakeBG.cpp
Iwao@DS116:/var/…/Test/up_bg/data$ ./a.out
0.523599 0.500000 0.866025
dib ? =
予想以上に時間がかかってしまったが,何とか…
daikoku_edit.html



  にほんブログ村 IT技術ブログへ


Cardboard と WebGL

Cardboard で撮った画像を,WebGL の背景として利用してみた.

もう少しうまく貼れればと思うが,方法がわからない.
球に貼っているため縦方向に引き伸ばされてしまう.


以下,画像は 横:縦 = 2:1 に編集している.
このすぐ下は,SceneJS を使用したもの.


2018/04/27 画像をアップロードできるページ
360度パノラマ画像の表示



  にほんブログ村 IT技術ブログへ


B-Spline ノットベクトル

v_double	BS_make_knot	(const Vd4A& pnts,const size_t order)
{
	v_double	knot ;
	size_t		degree = order - 1 ;
	{
		for (size_t index0=0 ; index0< degree ; index0++) {
			knot.push_back(0) ;
			}
		for (size_t index_=0 ; index_< pnts.size()-degree ; index_++) {
			knot.push_back(index_) ;
			}
		for (size_t indexL=0 ; indexL< degree+1 ; indexL++) {
			knot.push_back(pnts.size()-degree) ;
			}
		}
	return	knot ;
	}

「制御点 8 個,次数(degree) 2」で求まったノットは,
    0   0   0   1   2   3   4   5   6   6   6         



  にほんブログ村 IT技術ブログへ


B-Spline basis

3D グラフィックスのための数学入門 157 ページをコードに.
コードは,kodatuno を参考にさせてもらった.

double BS_basis (const double t,c_v_double& knot,const long order,const long i) { if (order <= 0) { return 0. ; } if (order == 1) { // Ni,0(t) if (t == knot[knot.size()-1]) { if (knot[i]<=t && t<=knot[i+1]) { return 1. ; } else { return 0. ; } } else { if (knot[i]<=t && t< knot[i+1]) { return 1. ; } else { return 0. ; } } } else { double n1 = 0 ; // (*/0) --> n = 0 double n2 = 0 ; double d1 = knot[i+order-1] - knot[i ] ; // T(i+k) -T(i) double d2 = knot[i+order-0] - knot[i+1] ; // T(i+k+1)-T(i+1) if (!::V1_is_near<double<(d1,0)) { n1 = t - knot[i] ; // t - T(i) n1 = n1 * BS_basis(t,knot,order-1,i ) ; // N(i, k-1)(t) n1 = n1 / d1 ; } if (!::V1_is_near<double<(d2,0)) { n2 = knot[i+order-0] - t ; // T(i+k+1)-t n2 = n2 * BS_basis(t,knot,order-1,i+1) ; // N(i+1,k-1)(t) n2 = n2 / d2 ; } return (n1 + n2) ; } return -1. ; }
double BS_basis (const double t,const long order,const long i) { if (order <= 0) { return 0. ; } if (order == 1) { // Ni,0(t) if (i<=t && t< i+1) { return 1. ; } else { return 0. ; } } else { double n1 = 0 ; double n2 = 0 ; double d1 = order - 1 ; // k double d2 = order - 1 ; // k if (!::V1_is_near<double<(d1,0)) { n1 = t - i ; // t-i n1 = n1 * BS_basis(t,order-1,i ) ; // N(i ,k-1) n1 = n1 / d1 ; } if (!::V1_is_near<double<(d2,0)) { n2 = (i+order-0) - t ; // i+k+1 - t n2 = n2 * BS_basis(t,order-1,i+1) ; // N(i+1,k-1) n2 = n2 / d2 ; } return (n1 + n2) ; } return -1. ; }
long pt_count = 7 ; v_vd_n.resize(pt_count) ; for (size_t index=0 ; index<10 ; index++) { for (size_t index_d=0 ; index_d<div_c ; index_d++) { double t = double(index*div_c + index_d)/div_c ; for (size_t i=0 ; i<pt_count ; i++) { double r = ::BS_basis(t,order,i) ; Vd3A v3a = v_vd_n[i] ; Vd3 v(v3a.size(),r*100,0) ; v3a.push_back(v) ; v_vd_n[i] = v3a ; } } }




  にほんブログ村 IT技術ブログへ


Rational B-Spline

Vd4 として w に設定してみたが,これで良いのか?

Vd3A	b_spline	(const Vd4& q0,const Vd4& q1,const Vd4& q2,const Vd4& q3,const long div_c)
{
	Vd3A	vd3a ;
	for (long index=0 ; index<=div_c ; index++) {
		double	t  = 1./div_c*index ;
		double	n0 = 1./6 * (1.-t)*(1.-t)*(1.-t) ;
		double	n1 = 1./2 * t*t*t - t*t + 2./3 ;
		double	n2 =-1./2 * t*t*t + 1./2 * t*t + 1./2 *t + 1./6 ;
		double	n3 = 1./6 * t*t*t ;
		double	px = ( (n0*q0.x)*q0.w + (n1*q1.x)*q1.w + (n2*q2.x)*q2.w + (n3*q3.x)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
		double	py = ( (n0*q0.y)*q0.w + (n1*q1.y)*q1.w + (n2*q2.y)*q2.w + (n3*q3.y)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
		double	pz = ( (n0*q0.z)*q0.w + (n1*q1.z)*q1.w + (n2*q2.z)*q2.w + (n3*q3.z)*q3.w ) / ((n0)*q0.w + (n1)*q1.w + (n2)*q2.w + (n3)*q3.w) ;
		vd3a.push_back(Vd3(px,py,pz)) ;
		}
	return	vd3a ;
	}



  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。