@srsergio/taptapp-ar 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,7 +14,7 @@ import { gpuCompute } from "../utils/gpu-compute.js";
14
14
  const PYRAMID_MIN_SIZE = 8;
15
15
  const PYRAMID_MAX_OCTAVE = 5;
16
16
  const NUM_BUCKETS_PER_DIMENSION = 8;
17
- const MAX_FEATURES_PER_BUCKET = 3; // Optimizado: Reducido de 5 a 3 para menor peso
17
+ const MAX_FEATURES_PER_BUCKET = 10; // Aumentado de 3 a 10 para mayor densidad de puntos tracking
18
18
  const ORIENTATION_NUM_BINS = 36;
19
19
  const FREAK_EXPANSION_FACTOR = 7.0;
20
20
  // Global GPU mode flag
@@ -241,8 +241,8 @@ export class DetectorLite {
241
241
  for (let y = 1; y < height - 1; y++) {
242
242
  for (let x = 1; x < width - 1; x++) {
243
243
  const val = curr.data[y * width + x];
244
- if (Math.abs(val) < 0.015)
245
- continue; // Threshold
244
+ if (Math.abs(val) < 0.01)
245
+ continue; // Threshold reducido de 0.015 a 0.01 para mayor sensibilidad
246
246
  let isMaxima = true;
247
247
  let isMinima = true;
248
248
  // Check 3x3 neighborhood in current scale
@@ -152,14 +152,19 @@ class SimpleAR {
152
152
  // Matrix is column-major: [m0,m1,m2,m3, m4,m5,m6,m7, m8,m9,m10,m11, m12,m13,m14,m15]
153
153
  const tx = worldMatrix[12];
154
154
  const ty = worldMatrix[13];
155
- const matrixScale = Math.sqrt(worldMatrix[0] ** 2 + worldMatrix[1] ** 2);
155
+ const tz = worldMatrix[14];
156
+ // focal length (roughly 45 degrees FOV)
157
+ const f = videoH / 2 / Math.tan((45.0 * Math.PI / 180) / 2);
158
+ // Standard perspective projection to screen space
159
+ // tx, ty, tz are in marker units relative to camera
160
+ const screenX = offsetX + (videoW / 2 + (tx * f / -tz)) * scaleX;
161
+ const screenY = offsetY + (videoH / 2 - (ty * f / -tz)) * scaleY;
162
+ // Calculate rotation and scale from the matrix
156
163
  const rotation = Math.atan2(worldMatrix[1], worldMatrix[0]);
157
- // Convert from normalized coords to screen coords
158
- const screenX = offsetX + (videoW / 2 + tx) * scaleX;
159
- const screenY = offsetY + (videoH / 2 - ty) * scaleY;
160
- // Scale factor: use a reasonable multiplier (0.5 instead of 0.01)
161
- // The matrixScale from the tracking is in image-space coordinates
162
- const finalScale = matrixScale * scaleX * 0.5;
164
+ const matrixScale = Math.sqrt(worldMatrix[0] ** 2 + worldMatrix[1] ** 2);
165
+ // Perspective scale: how much larger/smaller the object is based on distance (tz)
166
+ const perspectiveScale = (f / -tz) * scaleX;
167
+ const finalScale = matrixScale * perspectiveScale;
163
168
  // Apply transform
164
169
  this.overlay.style.position = 'absolute';
165
170
  this.overlay.style.transformOrigin = 'center center';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@srsergio/taptapp-ar",
3
- "version": "1.0.15",
3
+ "version": "1.0.16",
4
4
  "description": "AR Compiler for Node.js and Browser",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@ import { gpuCompute } from "../utils/gpu-compute.js";
16
16
  const PYRAMID_MIN_SIZE = 8;
17
17
  const PYRAMID_MAX_OCTAVE = 5;
18
18
  const NUM_BUCKETS_PER_DIMENSION = 8;
19
- const MAX_FEATURES_PER_BUCKET = 3; // Optimizado: Reducido de 5 a 3 para menor peso
19
+ const MAX_FEATURES_PER_BUCKET = 10; // Aumentado de 3 a 10 para mayor densidad de puntos tracking
20
20
  const ORIENTATION_NUM_BINS = 36;
21
21
  const FREAK_EXPANSION_FACTOR = 7.0;
22
22
 
@@ -282,7 +282,7 @@ export class DetectorLite {
282
282
  for (let x = 1; x < width - 1; x++) {
283
283
  const val = curr.data[y * width + x];
284
284
 
285
- if (Math.abs(val) < 0.015) continue; // Threshold
285
+ if (Math.abs(val) < 0.01) continue; // Threshold reducido de 0.015 a 0.01 para mayor sensibilidad
286
286
 
287
287
  let isMaxima = true;
288
288
  let isMinima = true;
@@ -179,16 +179,23 @@ class SimpleAR {
179
179
  // Matrix is column-major: [m0,m1,m2,m3, m4,m5,m6,m7, m8,m9,m10,m11, m12,m13,m14,m15]
180
180
  const tx = worldMatrix[12];
181
181
  const ty = worldMatrix[13];
182
- const matrixScale = Math.sqrt(worldMatrix[0] ** 2 + worldMatrix[1] ** 2);
183
- const rotation = Math.atan2(worldMatrix[1], worldMatrix[0]);
182
+ const tz = worldMatrix[14];
183
+
184
+ // focal length (roughly 45 degrees FOV)
185
+ const f = videoH / 2 / Math.tan((45.0 * Math.PI / 180) / 2);
184
186
 
185
- // Convert from normalized coords to screen coords
186
- const screenX = offsetX + (videoW / 2 + tx) * scaleX;
187
- const screenY = offsetY + (videoH / 2 - ty) * scaleY;
187
+ // Standard perspective projection to screen space
188
+ // tx, ty, tz are in marker units relative to camera
189
+ const screenX = offsetX + (videoW / 2 + (tx * f / -tz)) * scaleX;
190
+ const screenY = offsetY + (videoH / 2 - (ty * f / -tz)) * scaleY;
191
+
192
+ // Calculate rotation and scale from the matrix
193
+ const rotation = Math.atan2(worldMatrix[1], worldMatrix[0]);
194
+ const matrixScale = Math.sqrt(worldMatrix[0] ** 2 + worldMatrix[1] ** 2);
188
195
 
189
- // Scale factor: use a reasonable multiplier (0.5 instead of 0.01)
190
- // The matrixScale from the tracking is in image-space coordinates
191
- const finalScale = matrixScale * scaleX * 0.5;
196
+ // Perspective scale: how much larger/smaller the object is based on distance (tz)
197
+ const perspectiveScale = (f / -tz) * scaleX;
198
+ const finalScale = matrixScale * perspectiveScale;
192
199
 
193
200
  // Apply transform
194
201
  this.overlay.style.position = 'absolute';