class IntMouse3D { IntEnv3D env; //環境 float x, y, z, px, py, pz; float d; float d_org; float fix_x, fix_y, fix_z; IntMouse3D(IntEnv3D in_env, float in_d){ env = in_env; d = d_org = in_d; x = px = 0; y = py = 0; z = pz = 0; fix_x = fix_y = fix_z = 0; } boolean operate(){ px = x; py = y; pz = z; if(!IntMouse.pressed) d = d_org; float kk = d / env.cam.r; float n1 = ( env.cam.cx - env.cam.x ) * kk; float n2 = ( env.cam.cy - env.cam.y ) * kk; float n3 = ( env.cam.cz - env.cam.z ) * kk; float ndd = n1*n1 + n2*n2 + n3*n3; float nd = sqrt(ndd); float yt1 = - ( n2 / ndd ) * n1; float yt2 = 1 - ( n2 / ndd ) * n2; float yt3 = - ( n2 / ndd ) * n3; float ytd = sqrt( yt1*yt1 + yt2*yt2 + yt3*yt3 ); float y1 = yt1 / ytd; float y2 = yt2 / ytd; float y3 = yt3 / ytd; float x1 = ( n2*y3 - n3*y2 ) / nd; float x2 = ( n3*y1 - n1*y3 ) / nd; float x3 = ( n1*y2 - n2*y1 )/nd; float w = d * tan( env.cam.fov / 2 ); float wr = w / 40; float xx = IntMouse.x / (width / 2.0) - 1; float yy = IntMouse.y / (height / 2.0) - 1; x = w * ( xx*x1 + yy*y1 ) + n1 + env.cam.x; y = w * ( xx*x2 + yy*y2 ) + n2 + env.cam.y; z = w * ( xx*x3 + yy*y3 ) + n3 + env.cam.z; if( IntKey.kx ){ if( IntKey.kx_prs ) fix_x = x; float k = ( fix_x - env.cam.x ) / ( x - env.cam.x ); x = fix_x; y = env.cam.y + k * ( y - env.cam.y ); z = env.cam.z + k * ( z - env.cam.z ); //d = dist(env.cam.x, env.cam.y, env.cam.z, x, y, z); update_depth( x, y, z ); return true; } else if( IntKey.ky ){ if( IntKey.ky_prs ) fix_y = y; float k = ( fix_y - env.cam.y ) / ( y - env.cam.y ); x = env.cam.x + k * ( x - env.cam.x ); y = fix_y; z = env.cam.z + k * ( z - env.cam.z ); //d = dist(env.cam.x, env.cam.y, env.cam.z, x, y, z); update_depth( x, y, z ); return true; } else if( IntKey.kz ){ if( IntKey.kz_prs ) fix_z = z; float k = ( fix_z - env.cam.z ) / ( z - env.cam.z ); x = env.cam.x + k * ( x - env.cam.x ); y = env.cam.y + k * ( y - env.cam.y ); z = fix_z; //d = dist(env.cam.x, env.cam.y, env.cam.z, x, y, z); update_depth( x, y, z ); return true; } else return false; } void update_depth( float ix, float iy, float iz ){ //奥行きを、ix, iy, iz を含む平面に更新 float n1 = env.cam.cx - env.cam.x; float n2 = env.cam.cy - env.cam.y; float n3 = env.cam.cz - env.cam.z; d = ( n1*ix + n2*iy + n3*iz - (n1*env.cam.x + n2*env.cam.y + n3*env.cam.z) ) * env.cam.r / ( n1*n1 + n2*n2 + n3*n3 ); } void disp(){ if( IntMouse.pressed && !IntKey.shift && !IntKey.ctrl){ noFill(); stroke(255, 150, 150); if(IntKey.kx){ beginShape(); vertex( x, env.y1, env.z1); vertex( x, env.y1, env.z2); vertex( x, env.y2, env.z2); vertex( x, env.y2, env.z1); endShape(CLOSE); } else if(IntKey.ky){ beginShape(); vertex( env.x1, y, env.z1); vertex( env.x1, y, env.z2); vertex( env.x2, y, env.z2); vertex( env.x2, y, env.z1); endShape(CLOSE); } else if(IntKey.kz){ beginShape(); vertex( env.x1, env.y1, z); vertex( env.x2, env.y1, z); vertex( env.x2, env.y2, z); vertex( env.x1, env.y2, z); endShape(CLOSE); } stroke(255, 150, 150); beginShape(LINES); vertex( env.x1, y, z); vertex( env.x2, y, z); vertex( x, env.y1, z); vertex( x, env.y2, z); vertex( x, y, env.z1); vertex( x, y, env.z2); endShape(); } } }