GPU拾取-精灵周围的不可见像素

2023-12-05

我正在渲染一个包含精灵的拾取场景。当我的光标靠近精灵时,它会注册为一种颜色并被“拾取”。当你放大精灵时,这个不可见的边框会变得更大。

打开控制台即可查看实时打印的 ID。将光标移近或远离大精灵和小精灵。您将看到精灵在不可见的边框上被选中。这种行为不会发生在常规几何体上,只会发生在精灵上。

这很奇怪,因为我正在渲染什么renderer.readRenderTargetPixels实际上看到了。

如何摆脱隐形边界以实现更准确的拣选?

enter image description here

var renderer, scene, camera, controls;

var particles, uniforms;

var PARTICLE_SIZE = 50;

var raycaster, intersects;
var mouse, INTERSECTED;

var pickingTexture;

var numOfVertices;

init();
animate();

function init() {

    container = document.getElementById('container');

    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);
    camera.position.z = 150;

    //

    var geometry1 = new THREE.BoxGeometry(200, 200, 200, 4, 4, 4);
    var vertices = geometry1.vertices;
    numOfVertices = vertices.length;

    var positions = new Float32Array(vertices.length * 3);
    var colors = new Float32Array(vertices.length * 3);
    var sizes = new Float32Array(vertices.length);

    var vertex;
    var color = new THREE.Color();

    for (var i = 0, l = vertices.length; i < l; i++) {

        vertex = vertices[i];
        vertex.toArray(positions, i * 3);

        color.setHex(i + 1);
        color.toArray(colors, i * 3);

        sizes[i] = PARTICLE_SIZE * 0.5;

    }

    var geometry = new THREE.BufferGeometry();
    geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));
    geometry.addAttribute('customColor', new THREE.BufferAttribute(colors, 3));
    geometry.addAttribute('size', new THREE.BufferAttribute(sizes, 1));

    //

    var material = new THREE.ShaderMaterial({

        uniforms: {
//                texture: {type: "t", value: THREE.ImageUtils.loadTexture("../textures/circle.png")}
            texture: {type: "t", value: THREE.ImageUtils.loadTexture("../textures/disc.png")}
        },
        vertexShader: document.getElementById('vertexshader').textContent,
        fragmentShader: document.getElementById('fragmentshader').textContent,
        depthTest: false,
        transparent: false
//            alphaTest: 0.9

    });

    //

    particles = new THREE.Points(geometry, material);
    scene.add(particles);

    //

    renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.setClearColor(0xffffff);
    container.appendChild(renderer.domElement);

    //

    raycaster = new THREE.Raycaster();
    mouse = new THREE.Vector2();

    //


    //

    window.addEventListener('resize', onWindowResize, false);
    document.addEventListener('mousemove', onDocumentMouseMove, false);

    // defaults are on the right (except minFilter)
    var options = {
        format: THREE.RGBAFormat,       // THREE.RGBAFormat
        type: THREE.UnsignedByteType,   // THREE.UnsignedByteType
        anisotropy: 1,                  // 1
        magFilter: THREE.LinearFilter,  // THREE.LinearFilter
        minFilter: THREE.LinearFilter,  // THREE.LinearFilter
        depthBuffer: true,              // true
        stencilBuffer: true             // true
    };

    pickingTexture = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, options);
    pickingTexture.texture.generateMipmaps = false;

    controls = new THREE.OrbitControls(camera, container);
    controls.damping = 0.2;
    controls.enableDamping = false;

}

function onDocumentMouseMove(e) {

//        event.preventDefault();

    mouse.x = e.clientX;
    mouse.y = e.clientY;

}

function onWindowResize() {

    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);

}

function animate() {

    requestAnimationFrame(animate);


    controls.update();

    render();

}

function render() {

    pick();
    renderer.render(scene, camera);


}

function pick() {

    renderer.render(scene, camera, pickingTexture);

    //create buffer for reading single pixel
    var pixelBuffer = new Uint8Array(4);

    //read the pixel under the mouse from the texture
    renderer.readRenderTargetPixels(pickingTexture, mouse.x, pickingTexture.height - mouse.y, 1, 1, pixelBuffer);

    //interpret the pixel as an ID

    var id = ( pixelBuffer[0] << 16 ) | ( pixelBuffer[1] << 8 ) | ( pixelBuffer[2] );
    if (id <= numOfVertices) console.log(id);

}
body {
    color: #ffffff;
    background-color: #000000;
    margin: 0px;
    overflow: hidden;
}
<script src="http://threejs.org/build/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/OrbitControls.js"></script>



<script type="x-shader/x-fragment" id="fragmentshader">

uniform sampler2D texture;
varying vec3 vColor;

void main() {

    // solid squares of color
    gl_FragColor = vec4( vColor, 1.0 );

}

</script>

<script type="x-shader/x-vertex" id="vertexshader">

attribute float size;
attribute vec3 customColor;
varying vec3 vColor;

void main() {

    vColor = customColor;

    vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

    gl_PointSize = size * ( 300.0 / length( mvPosition.xyz ) );

    gl_Position = projectionMatrix * mvPosition;

}

</script>
<div id="container"></div>

问题是您使用的设备具有 devicePixelRatio != 1.0 和 Three.js 的大小。

因为你打来电话renderer.setPixelRatio现在魔法发生在幕后。您的画布不是您请求的尺寸,而是基于 Three.js 代码中隐藏的某些公式的其他尺寸。

那么,会发生什么。您的画布是一种尺寸,但您的渲染目标是不同的尺寸。你的着色器使用gl_PointSize来画出它的要点。该大小以设备像素为单位。由于渲染目标的大小不同,因此渲染目标中的点大小与屏幕上的点大小不同。

删除对render.setPixelRatio它将开始工作。

IMO 解决这个问题的正确方法是使用devicePixelRatio你自己,因为这样你就可以 100% 看到正在发生的一切。幕后没有发生任何魔法。

So,

  1. 摆脱容器,直接使用画布

    <canvas id="c"></canvas>
    
  2. 设置要使用的画布100vw对于宽度,100vh为身高而打造的身材margin: 0;

    canvas { width: 100vw; height: 100vh; display: block; }
    body { margin: 0; }
    

    这将使您的画布自动拉伸以填充窗口。

  3. 使用浏览器拉伸画布的大小来选择其绘图缓冲区应有的大小并乘以devicePixelRatio。假设您确实想要支持设备像素比。无需执行两次,因此如下D.R.Y.所以只需在 onWindowResize 中执行即可。

        canvas = document.getElementById("c");
        renderer = new THREE.WebGLRenderer({
            antialias: true,
            alpha: true,
            canvas: canvas,
        });
        pickingTexture = new THREE.WebGLRenderTarget(1, 1, options);
    
        onWindowResize(); 
    
    ...
    
    function onWindowResize() {
    
        var width = canvas.clientWidth * window.devicePixelRatio;
        var height = canvas.clientHeight * window.devicePixelRatio;
    
        camera.aspect = width / height;
        camera.updateProjectionMatrix();
    
        renderer.setSize(width, height, false);  // YOU MUST PASS FALSE HERE otherwise three.js will muck with the CSS
        pickingTexture.setSize(width, height);  
    }
    
  4. 将鼠标坐标转换为设备坐标

        renderer.readRenderTargetPixels(
            pickingTexture, 
            mouse.x * window.devicePixelRatio, 
            pickingTexture.height - mouse.y * window.devicePixelRatio,
            1, 1, pixelBuffer);
    

这是该解决方案

var renderer, scene, camera, controls;

var particles, uniforms;

var PARTICLE_SIZE = 50;

var raycaster, intersects;
var mouse, INTERSECTED;

var pickingTexture;

var numOfVertices;
var info = document.querySelector('#info');

init();
animate();

function init() {

    canvas = document.getElementById('c');

    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera(45, 1, 1, 10000);
    camera.position.z = 150;

    //

    var geometry1 = new THREE.BoxGeometry(200, 200, 200, 4, 4, 4);
    var vertices = geometry1.vertices;
    numOfVertices = vertices.length;

    var positions = new Float32Array(vertices.length * 3);
    var colors = new Float32Array(vertices.length * 3);
    var sizes = new Float32Array(vertices.length);

    var vertex;
    var color = new THREE.Color();

    for (var i = 0, l = vertices.length; i < l; i++) {

        vertex = vertices[i];
        vertex.toArray(positions, i * 3);

        color.setHex(i + 1);
        color.toArray(colors, i * 3);

        sizes[i] = PARTICLE_SIZE * 0.5;

    }

    var geometry = new THREE.BufferGeometry();
    geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
    geometry.setAttribute('customColor', new THREE.BufferAttribute(colors, 3));
    geometry.setAttribute('size', new THREE.BufferAttribute(sizes, 1));

    //

    var loader = new THREE.TextureLoader();
    var material = new THREE.ShaderMaterial({

        uniforms: {
//                texture: {type: "t", value: THREE.ImageUtils.loadTexture("../textures/circle.png")}
            texture: {value: loader.load("https://i.imgur.com/iXT97XR.png")}
        },
        vertexShader: document.getElementById('vertexshader').textContent,
        fragmentShader: document.getElementById('fragmentshader').textContent,
        depthTest: false,
        transparent: false
//            alphaTest: 0.9

    });

    //

    particles = new THREE.Points(geometry, material);
    scene.add(particles);

    //

    renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true,
        canvas: canvas,
    });
    renderer.setClearColor(0xffffff);
    //

    raycaster = new THREE.Raycaster();
    mouse = new THREE.Vector2();

    //


    //

    window.addEventListener('resize', onWindowResize, false);
    document.addEventListener('mousemove', onDocumentMouseMove, false);

    // defaults are on the right (except minFilter)
    var options = {
        format: THREE.RGBAFormat,       // THREE.RGBAFormat
        type: THREE.UnsignedByteType,   // THREE.UnsignedByteType
        anisotropy: 1,                  // 1
        magFilter: THREE.LinearFilter,  // THREE.LinearFilter
        minFilter: THREE.LinearFilter,  // THREE.LinearFilter
        depthBuffer: true,              // true
        stencilBuffer: true             // true
    };

    pickingTexture = new THREE.WebGLRenderTarget(1, 1, options);
    pickingTexture.texture.generateMipmaps = false;

    controls = new THREE.OrbitControls(camera, canvas);
    controls.damping = 0.2;
    controls.enableDamping = false;

    onWindowResize();

}

function onDocumentMouseMove(e) {

//        event.preventDefault();

    mouse.x = e.clientX;
    mouse.y = e.clientY;

}

function onWindowResize() {

    var width = canvas.clientWidth * window.devicePixelRatio;
    var height = canvas.clientHeight * window.devicePixelRatio;

    camera.aspect = width / height;
    camera.updateProjectionMatrix();

    renderer.setSize(width, height, false);  // YOU MUST PASS FALSE HERE!
    pickingTexture.setSize(width, height);  
}

function animate() {

    requestAnimationFrame(animate);


    controls.update();

    render();

}

function render() {

    pick();
    renderer.render(scene, camera);


}

function pick() {
    renderer.setRenderTarget(pickingTexture);
    renderer.setClearColor(0);
    renderer.render(scene, camera);
    renderer.setClearColor(0xFFFFFF);
    renderer.setRenderTarget(null)

    //create buffer for reading single pixel
    var pixelBuffer = new Uint8Array(4);

    //read the pixel under the mouse from the texture
    renderer.readRenderTargetPixels(pickingTexture, mouse.x * window.devicePixelRatio, pickingTexture.height - mouse.y * window.devicePixelRatio, 1, 1, pixelBuffer);

    //interpret the pixel as an ID

    var id = ( pixelBuffer[0] << 16 ) | ( pixelBuffer[1] << 8 ) | ( pixelBuffer[2] );
    //if (id > 0) console.log(id);
    info.textContent = id;

}
body {
    color: #ffffff;
    background-color: #000000;
    margin: 0;
}
canvas { width: 100vw; height: 100vh; display: block; }
#info { position: absolute; left: 0; top: 0; color: red; background: black; padding: 0.5em; font-family: monospace; }
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>



<script type="x-shader/x-fragment" id="fragmentshader">

uniform sampler2D texture;
varying vec3 vColor;

void main() {

    // solid squares of color
    gl_FragColor = vec4( vColor, 1.0 );

}

</script>

<script type="x-shader/x-vertex" id="vertexshader">

attribute float size;
attribute vec3 customColor;
varying vec3 vColor;

void main() {

    vColor = customColor;

    vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

    gl_PointSize = size * ( 300.0 / length( mvPosition.xyz ) );

    gl_Position = projectionMatrix * mvPosition;

}

</script>
<canvas id="c"></canvas>
<div id="info"></div>

请注意其他一些事项。

  1. 我猜你真的想将拾取纹理清除为零而不是白色。这样 0 = 那里什么都没有,其他任何东西 = 那里有东西。

    renderer.setClearColor(0);
    renderer.render(scene, camera, pickingTexture);
    renderer.setClearColor(0xFFFFFF);
    
  2. 不知道是什么id <= numOfVertices means

    因此,鉴于现在它已清零,代码只是

    if (id) console.log(id);
    
  3. 我没有在初始化时设置渲染器大小、pickingTexture 大小或相机方面。

    为什么要重复我自己呢。onWindowResize已经设置了

  4. 当画布大小调整时,您需要调整pickingTexture渲染目标的大小,使其大小匹配。

  5. 我删除了大部分引用window.innerWidth and window.innerHeight

    我本想删除所有这些,但我不想为此示例更改更多代码。使用window.innerWidth将代码绑定到窗口。如果您想在不是窗口全尺寸的内容中使用代码,例如,假设您制作编辑。您必须更改代码。

    以适用于更多情况的方式编写代码并不困难,所以为什么以后要为自己做更多的工作呢。

其他我没有选择的解决方案

  1. 你可以打电话render.setPixelRatio然后设置pickingTexture渲染目标的大小window.devicePixelRatio

    我没有选择这个解决方案,因为你必须猜测 Three.js 在幕后做了什么。你的猜测今天可能是正确的,但明天可能是错误的。如果你告诉 Three.js 似乎更好做点什么width by height它应该能成功width by height而不是把它变成别的东西。同样,您必须猜测 Three.js 何时应用 PixelRatio,何时不应用。正如您在上面注意到的,它不会将其应用于渲染目标的大小,而且它不能,因为它不知道您的目的是什么。您正在制作用于拾取的渲染目标吗?为了全屏效果?为了捕捉?想要非全屏效果?因为它不知道它无法为您应用 PixelRatio。这在全部 Three.js 代码中都会发生。有些地方它应用pixelRatio,有些地方则不应用。你只能猜测。如果你从不设置pixelRatio,这个问题就会消失。

  2. 你可以通过devicePixelRatio进入你的着色器

    <script type="x-shader/x-vertex" id="vertexshader">
    
    attribute float size;
    attribute vec3 customColor;
    varying vec3 vColor;
    uniform float devicePixelRatio;  // added
    
    void main() {
        vColor = customColor;
        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
        gl_PointSize = size * ( 300.0 / length( mvPosition.xyz ) ) * devicePixelRatio;
        gl_Position = projectionMatrix * mvPosition;
    
    }
    </script>
    

    当然你需要设置devicePixelRatio穿着你的制服。

    I might选择这个解决方案。小问题是如果pickingTexture与画布后备缓冲区的分辨率不同,您可能会出现 1 个错误。在这种情况下,如果画布是 2 倍pickingTexture那么画布中每 4 个像素中有 3 个不存在于pickingTexture。不过,根据您的应用程序,这可能没问题。您无法选取 1/2 像素,至少无法使用鼠标。

    我可能不会选择这个解决方案的另一个原因是它只会让问题出现在其他地方。线宽为一,gl_FragCoord是另一个。视口和剪刀设置也是如此。最好使渲染目标大小与画布匹配,以便一切都相同,而不是做出越来越多的解决方法,并且必须记住在哪里使用一种尺寸与另一种尺寸。明天我开始使用PointsMaterial。 devicePixelRatio 也存在问题。通过不打电话renderer.setPixelRatio这些问题就会消失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU拾取-精灵周围的不可见像素 的相关文章

  • 如何将 Three.js 导入我的 Nuxt 项目

    我想将 THREE js 中的示例文件夹中的模块 例如 OBJLoader 导入到我的 Nuxt 项目中 我可以导入三个主文件夹 但是在尝试导入示例文件夹中的模块时会发生错误 尝试了官方文档中的这些步骤 https trijs org do
  • THREE.js 正交相机缩放到鼠标点

    我正在为我们的 THREE js 应用程序开发正交相机 本质上 该相机将以 2D 方式向用户呈现场景 用户可以选择在 2D 和 3D 相机之间切换 该相机将允许平移和缩放到鼠标点 我可以进行平移 也可以进行缩放 但不能缩放到鼠标点 这是我的
  • 如何从 cdn THREE.js 加载 GLTFLoader

    我在弄清楚如何让 GLTFLoader 在 THREE js 中工作时遇到一些问题 我不明白如何使用 CDN 站点来托管文件 我尝试过使用网络上示例的链接 但这并没有完成我的工作 我在另一篇文章中读到 GLTFLoader 文件必须与我正在
  • Three.js - 从点缩放圆柱体

    是否可以从特定点开始增加 Y 轴上圆柱体的比例 与圆柱体从其原点向上和向下生长到新比例不同 它只是像条形图一样从顶部向上 向下生长 当前代码 function animate render cylinder scale y 0 1 requ
  • ThreeJS中InstancedMesh和InterleavedBuffer的区别和使用

    任何人都可以帮助我们解决 Threejs 中 InstancedMesh 和 InterleavedBuffer 之间的区别吗 我对这两个主题都感到困惑 任何人都可以让我知道哪种是渲染大量几何图形的优化方法 提前致谢 实例化渲染和交错缓冲区
  • 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

    所以我有一个正在旋转然后再次平移和旋转的对象 我将这些翻译的矩阵存储为对象成员 现在 当我进行对象拾取时 我需要知道该对象的 3D 世界坐标 目前我已经能够像这样获得物体的位置 coords 0 finalMatrix 12 坐标 1 最终
  • Three.js:为 BufferGeometry 设置索引/索引的正确方法?

    我正在尝试在 BufferGeometry 中设置每个面的 UV 索引 我从几何开始 我的几何体的每个面都有一个face materialIndex对应于紫外线指数 我正在尝试将其转换为 BufferGeometry 然后映射到face m
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • 将几何图形转换为 BufferGeometry

    据我了解 Geometry 存储顶点和面的 javascript 对象结构 而 BufferGeometry 仅通过 Float32Arrays 等存储原始 gl 数据 有没有什么方法可以将标准 Geometry 转换为 BufferGeo
  • 使用 Three.js 在片段着色器中手动选择 mipmap 的 lod

    我正在使用 Three js 中的 glsl es 编写一个基于物理的着色器 为了添加镜面全局照明 我使用内部带有 mipmap 链的立方体贴图 dds 纹理 按照 CubeMapGen 的说明进行预先计算here http seblaga
  • Three.js 中的文本几何

    我在 Three js r74 中的 TextGeometry 遇到一些问题 我该如何正确实施 这是我的代码笔 codepen io cheesyeyes pen eJqZxK 提前致谢 好吧 对于每个正在寻找简单答案而不是链接和其他超载示
  • 深度图三.js

    Three js中有没有办法获取深度图 我感兴趣的是制作类似于 Kinect 为给定场景制作的东西 我遇到了一种不使用颜色和雾来模仿这一点的黑客方法 但这并不理想 因为它会使用两个不同的场景并且会因光照而变化 我认为执行此操作的另一种方法是
  • 扩展 Three.js 类

    我想扩展 Three js Object3D 类 但不知道该怎么做 有一个 Stackoverflow 问题 我已经阅读 重新阅读和尝试过 但无法让它为我工作 有没有办法扩展 ThreeJS 对象 https stackoverflow c
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • 三.js Raycaster intersectObjects

    我正在尝试修改这个例子 https github com timoxley threejs blob master examples webgl morphtargets md2 control html来自 Three js 通过鼠标点击
  • 三.JS Shadow 到对象

    我想添加castShadow and receiveShadow在一个物体上 但是下面的代码有什么问题吗 var mtlLoader new THREE MTLLoader mtlLoader setPath objects Tree mt
  • Three.js - 如何翻译几何图形

    我有一个脚本 可以定位各种宽度 高度和深度的立方体 并且正在努力根据 xAxis yAxis 和 zAxis 也有所不同 将它们准确地排列起来 var geometry new THREE BoxGeometry width height
  • Three.js - 将 WebGL 和 CSS3D 与 iFrame 混合

    我准备了一个混合的工作页面WebGL and CSS3D 在SO的一点帮助下here https stackoverflow com questions 24681170 three js properly blending css3d a
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋

随机推荐

  • 使用 const char*、to_string() 和 c_str() 时出现奇怪的输出

    我有一个程序使用to string转换一个int to a string 然后使用将其转换为 C 字符串string c str 它存储在一个数组中const char 当程序输出每个const char 结果并不出乎我的意料 对于下面的示
  • 将对象数组中的所有 null 更改为 '' (javascript)

    我有如下所示的对象数组 Object Results Array 3 Results Array 3 0 2 0 Object id null name Rick Value 34343 1 Object id 2 name null Va
  • 在 x 个字符后更改 CSS

    我里面有一个文本字符串td 如下 td This is a long line td 我想要做的是更改前七个字符之后所有字符的字体大小 现在我知道我可以执行以下操作 td This is span class different a lon
  • 在 DataGridView 中显示 SQL 结果的问题

    我试图在我的应用程序的数据网格视图中显示 SQL 查询的结果 下面的代码是我写的 但它似乎与我做什么无关 我无法在表单的 datagridview 中得到任何显示 有人能指出我正确的方向吗 code Sql SELECT FROM jobL
  • awk 中的矩阵加法

    我有一堆变量 如下所示 DURATION 1 57 DURATION 2 07 T0 10 T1 0 TX 0 T0 12 T1 0 TX 1 TC 1 IG 0 TC 2 IG 3 是否可以让 awk 处理这个结果 结果是 DURATIO
  • .NET 对象大小

    net 中堆分配对象的大小是多少 包括管理开销 我假设对象是沿着 4 字节边界分配的 还是使用了不同的方法 x86 上的 4 字节边界 x64 上可能有 8 字节边界 x86 上有 8 个字节的开销 用于类型引用和同步块 如果发现 x64
  • 关于 Express Request,Typescript 声明合并失败

    当我提出明确请求时 我收到此错误 error TS2339 Property test does not exist on type Request
  • Rails 3. 嵌套事务。子块中的异常

    为什么在子块中出现异常后 ActiveRecord 不回滚嵌套事务中的更改 以下是示例 1 gt gt Client transaction do gt Client create name gt Pavel gt gt Client tr
  • Dot net core 1 Tooling Preview 离线安装程序

    是否可以提供离线安装程序DotNetCore 1 0 1 VS2015Tools Preview2 谢谢 Lex Li答案 从以下位置下载在线安装程序here then 在同一文件夹中创建快捷方式 Add the layout开关 带空格
  • 过滤嵌套 JSON javascript

    我正在创建一个采用如下 JSON 的 API hightlights title Fun url fun index html queries music artists events internet title Internet url
  • 自定义元素的名称中是否需要破折号?

    是否可以命名您自己的自定义元素
  • 通过属性使用具有依赖属性的数据类

    例如 我有一堂课Circle 具有依赖属性 radius and circumference 使用a是有意义的dataclass这里是因为样板 init eq repr 和订购方法 lt 我选择一个属性依赖于另一个属性 例如周长是根据半径计
  • REDHAWK UHD 设备使用情况

    我已经成功安装了 UHD 设备以及 REDHAWK 版本 1 8 3 对我来说 如何将波形中的组件连接到设备管理器管理的设备并不明显 我也不清楚 IDL 接口和 USRP 设备上的数据端口之间的相互作用 我无法找到一个使用 USRP 设备发
  • 对 WPF 绑定中的值进行舍入

    我正在尝试实现一个进度条 顶部有一个文本框 也显示进度 然而 该百分比是小数 是否可以通过绑定对数据集中返回的值进行舍入 还是必须通过后面的代码来完成
  • EditText 没有捕获 ViewFlipper 的滑动?

    这太令人抓狂了 我有以下 XML 布局
  • Jaxen 是否仍得到积极支持/开发?

    Jaxen看起来像是一个不错的 可扩展的 XPath 项目 但它似乎没有被积极开发 也没有发布日期 即便是邮件列表网址已死 有人有这方面的信息吗 Jaxen仍在 Github 上积极开发
  • postgresql提取函数源码

    需要使用 SQL 提取 PostgreSQL 函数的源代码 我看到其中一个函数有这种奇怪的行为 所有其他函数 大约 200 都工作得很好 当我运行以下语句时 它有效 select prosrc from pg proc where pron
  • OSX 10.10 为什么 CUDA 7.5 认为我的驱动程序不足?

    我正在尝试在我的 Mac Pro 15 英寸 2009 年中 配备 GPU GeForce 9400M 上安装 CUDA 我已经安装了https developer nvidia com cuda downloads工具包 nvcc ver
  • 如何使用 MATLAB 找到距给定坐标最近的点?

    我需要用 Matlab 解决一个最小化问题 我想知道哪个是最简单的解决方案 我一直在考虑的所有潜在解决方案都需要大量的编程工作 假设我有一个纬度 经度坐标点 A B 我需要的是在纬度 经度坐标地图中搜索距离该点最近的点 特别是 纬度和经度数
  • GPU拾取-精灵周围的不可见像素

    我正在渲染一个包含精灵的拾取场景 当我的光标靠近精灵时 它会注册为一种颜色并被 拾取 当你放大精灵时 这个不可见的边框会变得更大 打开控制台即可查看实时打印的 ID 将光标移近或远离大精灵和小精灵 您将看到精灵在不可见的边框上被选中 这种行