wikillm

Concept · 1 paper · updated 2026-10-24

Point-to-grid interpolation (trilinear gridding)

Scatters each point of a cloud onto the eight corners of its grid cell with trilinear weights, so a regular 3D grid can feed ordinary 3D convolutions. Dividing each vertex sum by its neighbour count, as the paper writes it, keeps values from growing with local point density; the released code sums without the count. Only one paper card covers this concept.

point-cloud3d-gridinterpolationshape-completion

Markdown3 min read

AI-compiled overview, updated 2026-10-24, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

Overview

A point cloud has no order and no fixed grid, so convolutions cannot read it directly. Point-to-grid interpolation places each point on a regular grid of vertices. The point adds a weight to the eight vertices of the cell that contains it, and the weight falls off with distance along each axis 2006.03761 §3.2 2006.03761 eq. 3. The result is a dense array that a 3D CNN can process 2006.03761 §3.3.

The GRNet authors argue against the simpler alternative. Voxelising a cloud into binary cells loses geometric information, and the paper says the result is not a differentiable reconstruction target 2006.03761 §1 2006.03761 §3.2. Trilinear weights keep each point's contribution continuous in its position.

Only one paper card lists this concept, so the variants below are the forms found in that paper. They are not a survey of point-to-grid methods. The reverse step, grid to points, is a different operation (Gridding Reverse, then Cubic Feature Sampling) and is not covered here 2006.03761 §3.4 2006.03761 §3.5.

Variants

Trilinear splat, averaged over neighbours (as written)

Each vertex value is the sum of the trilinear weights of the points that neighbour it, divided by the number of those neighbours 2006.03761 §3.2 2006.03761 eq. 2. A vertex with no neighbour gets 0 [arxiv:2006.03761 §3.2]. Card: GRNet.

The division makes the vertex value an average, so it does not depend on how many points fall near that vertex. The paper's stated grid resolution is 64 vertices per axis 2006.03761 §4.7 2006.03761 tab. 5.

Trilinear splat, summed (as released)

The released CUDA kernel adds each trilinear product to its vertex and does not divide by the neighbour count gridding.cu. The vertex value therefore grows with local point density. The card records this as a difference between the paper and the code, and does not say which form produced the reported numbers 2006.03761 §3.2 2006.03761 eq. 2.

When to use which

SituationUseWhy
Point density varies across inputs, and grid magnitudes should not depend on itAveraged form (eq. 2)Dividing by the neighbour count makes each vertex an average, so the value does not scale with how many points cluster there 2006.03761 eq. 2
You need to match the released code's behaviour, for example to compare runsSummed formThe released kernel does not divide by the count gridding.cu. The card does not show that the paper's numbers came from it
The grid must be differentiable with respect to the point positions and feed a CNNTrilinear splat, either formThe paper rejects binary voxelisation for this purpose 2006.03761 §1 2006.03761 §3.2. Weights are continuous in the position
Finer detail is needed and the budget allows it64 vertices per axisIts ablation gives Chamfer 2.723 against 5.943 at 32 per axis (x10^-4, complete output) 2006.03761 tab. 5. The paper gives no cost of the gridding step alone; the whole network at 64 per axis has about 76.70 M parameters 2006.03761 tab. 5
Inputs are not in the unit cubeNormalise the cloud firstThe paper states no normalisation. The kernel computes cell indices with no range check, so points outside [-1, 1]^3 index outside the grid gridding.cu

Implementation sketch

Pseudocode for the forward splat, with the averaging step as a flag. The paper does not state the map from coordinates to vertex units, so that step is left to the implementer.

Pseudocode
# Trilinear splat of a point cloud onto an n^3 grid  [§3.2] [eq. 2] [eq. 3]
# Input:  points (P, 3) in [-1, 1]^3, n vertices per axis
# Output: grid (n, n, n)

def point_to_grid(points, n, average=True):
    grid = zeros(n, n, n)
    count = zeros(n, n, n)
    for p in points:
        # Position in vertex units; the paper does not state this map  [§3.2]
        x = to_vertex_units(p, n)
        # The point's cell has eight corner vertices  [§3.2]
        for v in cell_vertices(x):
            # Product over the three axes of 1 - |v - x|  [eq. 3]
            w = prod(1 - abs(v - x))
            grid[v] += w
            count[v] += 1
    if average:
        # Eq. 2: divide each sum by its neighbour count; empty vertices stay 0  [§3.2]
        grid = where(count > 0, grid / count, 0)
    return grid

Contradictions

  • Averaging. The paper divides each vertex sum by the number of neighbours 2006.03761 §3.2 2006.03761 eq. 2. The released kernel does not gridding.cu. Both are stated; this page does not choose between them.

Papers

Source and license

Compiled from the papers listed on this page, all published under CC BY, CC BY-SA or CC0, with citations. See each paper's page for its authors and license.