How to set the camera focus distance using expression?
2026 5 2- wanglifu
- Member
- 138 posts
- Joined: Feb. 2017
- Offline
- eikonoklastes
- Member
- 331 posts
- Joined: April 2018
- Offline
Check the below post, but please also RFE for this. This should be built into Houdini (with a better implementation than mine, obviously):
https://www.sidefx.com/forum/topic/7088/#post-374564 [www.sidefx.com]
https://www.sidefx.com/forum/topic/7088/#post-374564 [www.sidefx.com]
- wanglifu
- Member
- 138 posts
- Joined: Feb. 2017
- Offline
eikonoklastes
Check the below post, but please also RFE for this. This should be built into Houdini (with a better implementation than mine, obviously):
https://www.sidefx.com/forum/topic/7088/#post-374564 [www.sidefx.com]
Yeah,this should be a basic option.Sidefx please fix this in H20.
- guan9287
- Member
- 1 posts
- Joined: April 2021
- Offline
When using the transform to move the camera, the method mentioned above becomes ineffective. I used the 'wrangle' with the help of ChatGPT, and the following is the code:
matrix cameraTransform = usd_worldtransform(0,"/cameras/camera1");
matrix targetTransform = usd_worldtransform(1,"/pig/target_FD");
vector4 cameraPosHomogeneous = set(0, 0, 0, 1);
vector4 targetPosHomogeneous = set(0, 0, 0, 1);
cameraPosHomogeneous = cameraTransform * cameraPosHomogeneous;
targetPosHomogeneous = targetTransform * targetPosHomogeneous;
vector cameraPos = set(cameraPosHomogeneous, cameraPosHomogeneous, cameraPosHomogeneous);
vector targetPos = set(targetPosHomogeneous, targetPosHomogeneous, targetPosHomogeneous);
float distance = distance(cameraPos, targetPos);
usd_setattrib(0,"/cameras/camera1", "focusDistance", distance);
matrix cameraTransform = usd_worldtransform(0,"/cameras/camera1");
matrix targetTransform = usd_worldtransform(1,"/pig/target_FD");
vector4 cameraPosHomogeneous = set(0, 0, 0, 1);
vector4 targetPosHomogeneous = set(0, 0, 0, 1);
cameraPosHomogeneous = cameraTransform * cameraPosHomogeneous;
targetPosHomogeneous = targetTransform * targetPosHomogeneous;
vector cameraPos = set(cameraPosHomogeneous, cameraPosHomogeneous, cameraPosHomogeneous);
vector targetPos = set(targetPosHomogeneous, targetPosHomogeneous, targetPosHomogeneous);
float distance = distance(cameraPos, targetPos);
usd_setattrib(0,"/cameras/camera1", "focusDistance", distance);
- jsmack
- Member
- 7755 posts
- Joined: Sept. 2011
- Offline
guan9287
When using the transform to move the camera, the method mentioned above becomes ineffective. I used the 'wrangle' with the help of ChatGPT, and the following is the code:
matrix cameraTransform = usd_worldtransform(0,"/cameras/camera1");
matrix targetTransform = usd_worldtransform(1,"/pig/target_FD");
vector4 cameraPosHomogeneous = set(0, 0, 0, 1);
vector4 targetPosHomogeneous = set(0, 0, 0, 1);
cameraPosHomogeneous = cameraTransform * cameraPosHomogeneous;
targetPosHomogeneous = targetTransform * targetPosHomogeneous;
vector cameraPos = set(cameraPosHomogeneous, cameraPosHomogeneous, cameraPosHomogeneous);
vector targetPos = set(targetPosHomogeneous, targetPosHomogeneous, targetPosHomogeneous);
float distance = distance(cameraPos, targetPos);
usd_setattrib(0,"/cameras/camera1", "focusDistance", distance);
You can't use distance to set focal distance, as focal distance is distance between planes, not points. The target point should be transformed into the camera's local space and the dot product with the z axis (or just the z component) used as the focus distance.
- dmarkota_adm
- Member
- 1 posts
- Joined: June 2022
- Offline
Hi,
I revised this and the follwing works well for me:
I revised this and the follwing works well for me:
matrix cameraTransform = usd_worldtransform(0,"/cameras/camera1"); matrix targetTransform = usd_worldtransform(0,"/focusTarget"); vector cameraPos = cameraTransform * {0,0,0}; vector targetPos = targetTransform * {0,0,0}; float dist = distance(cameraPos, targetPos); usd_setattrib(0,"/cameras/camera1", "focusDistance", dist);
Edited by dmarkota_adm - April 20, 2024 03:45:37
-
- Quick Links